165个包,5s启动,算久么

如题,如题,,,

比较久。我53个包,0.3秒。

0.3秒怎么做到的?我零配置都没这么快。

算久的了,我176个packages, 直接启动0.9s, 使用daemon 0.435s

用esup看瓶颈在哪里,然后优化。优化主要是把require load之类的换成autoload。 如果你确实每次一启动就需要用一大堆东西,可以把加载完的状态dump出一个新的可执行文件。 https://www.emacswiki.org/emacs/DumpingEmacs 我没用dump已经是0.3秒了,所以没觉得有必要折腾那个。

我很怀疑你们的测试结果:

;; test-startup.el

(defvar init-start (current-time))
(add-hook 'after-init-hook
          (lambda ()
            (require 'evil)
            (evil-mode 1)
            (message (format "Init completed in %.6fs\n\n" (- (float-time (current-time)) (float-time init-start))))
            ))

这个配置应该怎么优化?

$ /path/to/emacs -nw -Q -l /path/to/test-startup.el
;; => Init completed in 0.574270s

我是 M-x,取的emacs-init-time

这个时间不准确,我在上边的配置里增加了几个包, (emacs-init-time) 结果是 0,跟实际相差甚远:

Init completed in 0.826895s
(emacs-init-time): 0.0 seconds

如果怀疑在 Emacs 内部所做的计算都不可靠,还可以采用外部工具:

$ time /path/to/emacs -nw -batch -l /path/to/test-startup.el
Debug on Error enabled globally
[yas] Prepared just-in-time loading of snippets (but no snippets found).
        0.96 real         0.77 user         0.07 sys
  1. 0.3s是我在台式机上测的,CPU 4.5GHz
  2. 我不知道evil有多大,我不用evil

另外我在启动期间把GC阈值调高了

(setq emacs-start-time (float-time))
(setq gc-cons-threshold 8000000)
(add-hook
 'after-init-hook
 (lambda ()
   (setq gc-cons-threshold (car (get 'gc-cons-threshold 'standard-value)))
   (insert (format ";; Emacs started in %fs\n"
                   (- (float-time) emacs-start-time)))))

GC 阈值调高确实有效果,我用上边的配置,时间从 0.8 降到 0.5。

我的电脑确实性能不太好,但我还是对各位的计算方法是否准确存疑。除了 (emacs-init-time) 函数的问题,还有记录开始时间的语句是不是最先执行打印结果的语句是不是最后执行。我用到了近 150 包,所有 {pre,post}-init 函数每个都监控到了,我统计到的时间应该是比较准确的,很接近 -batch 模式。

不管在 Emacs 内部采用何种方式统计,存在什么差异,-batch 模式是跑不掉的。

上面贴的片段是我的init.el开头。所以统计的是从开始执行init.el到结束的时间。从系统创建Emacs进程到Emacs开始执行init.el的时间我不关心,因为这部分时间本身很短,而且不改源代码也无法优化。在我的Windows台式机上一般都是0.3秒。MacbookPro上是0.7秒。 还有这是master分支。master分支最近几个月大幅度提高了启动速度。

把gc-cons-threshold设为10000000000,降了1.3s,再大,没效果了

看了下这符号的意义,改成100M了,效果一致

启动文件运行完以后记得改回来