大家的 mode-line 的渲染耗时是多少,这个对流畅度体验影响大吗?

大概就是用这样的方式可以看到时间,刚对自己的 mode-line 做了做优化,加了点缓存之类的,好像有点效果??

(defmacro +measure-time (&rest body)
  "Measure the time it takes to evaluate BODY."
  `(let ((time (current-time)))
     ,@body
     (message "%.06fs" (float-time (time-since time)))))

(+measure-time
 (format-mode-line mode-line-format))
;;; => "0.000341s"

3 个赞

在使用doom-modeline,发现耗时还是比较大的

;;=> "0.002637s"

:rofl: 用楼主的代码测试,时间大概是楼主的十分之一(

并没有,是我搞错了,见楼下的回复

大牛是怎么做到的?能分享一下配置吗?我就执行这一行就已经是楼主十分之一的两倍了 :man_facepalming:

(all-the-icons-icon-for-mode major-mode :height 0.8 :v-adjust 0.05)
;; => 0.000063s

我是用自己配置的modeline,耗时跟楼主差不多

;; => 0.000295s

看上去貌似耗时不长,但每次上下移动光标都会update modeline,用profiler看过,占用资源还是挺多的

抱歉,为了回复你我整理了一下代码,然后发现我的测试是有问题的。

原因是我用了 mini-modeline,用这个包的时候设置的变量不是 mode-line-format 而是 mini-modeline-r-format,但我测试的时候没想起来这个问题,导致实际上测了个生成空字符串的速度 :rofl: 修正测试以后发现也和楼主差不多

1 个赞

是你的10倍。0.003525s 用的是 doom-modeline.

Profiler 结果

Memory result

- redisplay_internal (C function)                                      3,766,980,440  70%
 + #<compiled -0x28a1d6254e46da3>                                      3,765,965,252  70%
 - eval                                                                      873,960   0%
  - doom-modeline-format--main                                               344,292   0%
   - format-mode-line                                                        324,308   0%
    - apply                                                                  324,308   0%
     - delight--format-mode-line                                             324,308   0%
      - apply                                                                324,308   0%
       - #<subr format-mode-line>                                            196,532   0%
        - eval                                                               196,532   0%
         - doom-modeline-segment--major-mode                                  64,992   0%
          - format-mode-line                                                  31,560   0%
           - apply                                                            31,560   0%
            - delight--format-mode-line                                       31,560   0%
               apply                                                          31,560   0%
           doom-modeline-segment--buffer-encoding                             49,140   0%
           doom-modeline-segment--vcs                                          8,368   0%
           doom-modeline-segment--input-method                                 4,224   0%
           doom-modeline-segment--checker                                      2,032   0%
           doom-modeline-segment--debug                                        1,016   0%
   - doom-modeline--font-width                                                13,728   0%
    - face-all-attributes                                                     13,728   0%
       mapcar                                                                 11,616   0%
  - doom-modeline-segment--workspace-name                                    171,552   0%
     eyebrowse--get                                                          166,584   0%
     assq-delete-all                                                           2,020   0%
    doom-modeline-segment--buffer-encoding                                    65,468   0%
  - doom-modeline-segment--major-mode                                         44,296   0%
   - format-mode-line                                                         11,880   0%
    - apply                                                                   11,880   0%
     - delight--format-mode-line                                              11,880   0%
        apply                                                                 11,880   0%
  - doom-modeline-segment--buffer-info                                        35,440   0%
     doom-modeline-propertize-icon                                             8,448   0%
  - doom-modeline-segment--buffer-position                                    34,360   0%
   - format-mode-line                                                          6,128   0%
    - apply                                                                    6,128   0%
     - delight--format-mode-line                                               6,128   0%
        apply                                                                  6,128   0%
  - doom-modeline-segment--vcs                                                10,440   0%
     doom-modeline-propertize-icon                                             1,056   0%
    doom-modeline-segment--checker                                             6,216   0%
    doom-modeline-segment--input-method                                        3,168   0%
    doom-modeline-segment--modals                                              3,088   0%
 - emojify-update-visible-emojis-background-after-window-scroll               68,376   0%
  - emojify--update-emojis-background-in-region-starting-at                   68,376   0%
     frame-height                                                             33,792   0%
     frame-width                                                              32,472   0%
     emojify--update-emojis-background-in-region                               2,112   0%
 - doom-modeline-refresh-bars                                                 46,532   0%
  - doom-modeline--make-xpm                                                   17,228   0%
   - create-image                                                              4,224   0%
    - apply                                                                    3,168   0%
       #<compiled 0x89a2ae6b4589e62>                                           2,112   0%
    - create-image-with-background-color                                       1,056   0%
     - let*                                                                    1,056   0%
        append                                                                 1,056   0%
 + which-key--hide-popup-on-frame-size-change                                 16,896   0%
 + desktop-auto-save-set-timer                                                 7,312   0%
 - mode-line-default-help-echo                                                 2,112   0%
  - window-at-side-p                                                           2,112   0%
     window-pixel-edges                                                        2,112   0%
+ command-execute                                                      1,564,230,582  29%
+ timer-event-handler                                                        288,726   0%
+ eldoc-pre-command-refresh-echo-area                                        253,684   0%
+ indent-guide-post-command-hook                                             228,900   0%
  posframe-run-hidehandler                                                   190,872   0%
+ emojify-update-visible-emojis-background-after-command                      46,384   0%
+ winner-save-old-configurations                                              28,192   0%
+ flyspell-post-command-hook                                                  18,440   0%
+ indent-guide-pre-command-hook                                                3,952   0%
+ jit-lock--antiblink-post-command                                             2,112   0%
+ eldoc-schedule-timer                                                         1,080   0%
+ global-font-lock-mode-check-buffers                                          1,056   0%
+ global-emojify-mode-check-buffers                                            1,056   0%
+ yas-global-mode-check-buffers                                                1,056   0%
+ global-edit-server-edit-mode-check-buffers                                   1,056   0%
  ...                                                                              0   0%

CPU result

- command-execute                                                                     242  62%
 - call-interactively                                                                 242  62%
  - funcall-interactively                                                             242  62%
   - counsel-M-x                                                                      202  51%
    - ivy-read                                                                        101  25%
     + read-from-minibuffer                                                            76  19%
     + ivy--reset-state                                                                11   2%
     + ivy-call                                                                         1   0%
      counsel--M-x-externs                                                            101  25%
   + ace-window                                                                        33   8%
   + previous-line                                                                      7   1%
- ...                                                                                 102  26%
   Automatic GC                                                                       102  26%
- redisplay_internal (C function)                                                      30   7%
 - #<compiled -0x28a1d6254e46da3>                                                      24   6%
  - apply                                                                              24   6%
   - zoom--handler                                                                     24   6%
    - apply                                                                            24   6%
     - #<compiled 0x1cf2838dafa0251f>                                                  24   6%
      + zoom--update                                                                   24   6%
 - eval                                                                                 4   1%
  - doom-modeline-format--main                                                          2   0%
   - doom-modeline--font-width                                                          2   0%
    - face-all-attributes                                                               2   0%
     - mapcar                                                                           2   0%
      - #<compiled 0xd6341811389e821>                                                   2   0%
         face-attribute                                                                 2   0%
  - doom-modeline-segment--workspace-name                                               1   0%
     eyebrowse--get                                                                     1   0%
    doom-modeline-segment--buffer-encoding                                              1   0%
 - doom-modeline-refresh-bars                                                           1   0%
    doom-modeline--font-height                                                          1   0%
 - emojify-update-visible-emojis-background-after-window-scroll                         1   0%
  - emojify--update-emojis-background-in-region-starting-at                             1   0%
     emojify--update-emojis-background-in-region                                        1   0%
+ indent-guide-post-command-hook                                                        7   1%
+ eldoc-pre-command-refresh-echo-area                                                   4   1%
+ timer-event-handler                                                                   3   0%
+ jit-lock--antiblink-post-command                                                      1   0%

doom-mode-line 好厉害啊,有这么多内容还能这么快。

可以贴一下 mode-line 配置的链接吗?学习一下

mini-modeline 和 awesome-tray 好像,把modeline内容转接到minibuffer不臃肿吗?

他也是可以设置,可以有两个 format ,一个左边一个右边。但是有个比较明显的问题就是在 message 出来的时候,整个 minibuffer 重绘会闪一下。

我自己写了一个 modeline 配着用,样子跟 awesome-tray 默认的几乎一样 :rofl:

它有一个比较好的地方,不会每次计算 modeline 都打印到 *Message* 里。

这个可能是 bug: Fix cursor not blink by using timer instead of hook by kiennq · Pull Request #20 · kiennq/emacs-mini-modeline · GitHub 引入的。我印象中之前感觉很 snappy,后来为了修一个 bug 用了这个 workaround 就经常看到闪烁了。

时间大约是楼主的三分之一,话说楼主那么短的时间也会对流畅度造成影响吗? :joy:

截屏2020-12-20 下午5.09.28

0.000225s 用的awesome-tray

它怎么做到不print到message buffer的?

我这只是东拼西凑出来的配置 zc-modeline.el :sweat_smile:

厉害啊,不过感觉你这个比我的复杂的多诶,性能确比我的好。。。还是说你电脑比较快

没有研究过(

跑个题,大家是如何做到把求值结果输出到comment里面的?

我记得之前试用 mini-modeline 时,它也没有 print 到 message buffer,如果你感兴趣可以研究一下它。