我可以做些基本的事情来减少启动时间?
就此而言,我是否需要特别注意什么?
注意:可以通过减少启动Emacs的频率(每次会话一次)并在正在运行的实例中打开文件来减少启动时间。这个问题是关于最小化启动时间,会话启动或需要启动Emacs的任何其他时间。
另请参见在Stack Overflow上回答的同一问题,问答得分超过50和30多个“收藏夹”书签。好的答案应该超出Stack Overflow的可用范围。
我可以做些基本的事情来减少启动时间?
就此而言,我是否需要特别注意什么?
注意:可以通过减少启动Emacs的频率(每次会话一次)并在正在运行的实例中打开文件来减少启动时间。这个问题是关于最小化启动时间,会话启动或需要启动Emacs的任何其他时间。
另请参见在Stack Overflow上回答的同一问题,问答得分超过50和30多个“收藏夹”书签。好的答案应该超出Stack Overflow的可用范围。
Answers:
这是我关于reduce的观点emacs-init-time
,它不涉及使用守护程序或服务器之类的事情,不用说,您永远都不应关闭emacs。
不需要init中的软件包,如果软件包没有正确的自动加载cookie,请确保在入口命令上设置了自动加载。因此,如果您第一次使用包foobar
是通过调用foobar-mode
而foobar
不是预先自动加载的,则将需要以下内容:
(autoload 'foobar-mode "foobar")
这样foobar-mode
即使在foobar
尚未加载软件包的情况下,您也可以拨打电话。foobar
在您实际致电之前,不会加载这种方式foobar-mode
package-refresh-contents
如果您不需要在启动时安装软件包,请不要运行。如果您将init设置为自动安装丢失的软件包,请考虑设置命令行arg,以指定何时进行自动安装。
desktop
除非您确实想要,否则不要在init上加载您的内容。请使用类似的方法use-package
来管理您的包裹。这样可以很容易地指定需要什么,以后要装载什么,自动装载什么,并使按包装对初始配置进行概要分析变得容易。
是否知道加载主题和启用主题之间的区别。简而言之,您可以加载任意数量的文件,但请确保不要启用多个文件。理想情况下,仅加载并启用一个主题。load-theme
需要一个可选的arg来防止启用主题。意外地启用多个主题很容易,这在启动时很慢而且很丑陋。
做作弊:您通常需要在初始化时加载大型全局模式,例如undo-tree,autocomplete,ido-mode等。确保进入功能具有自动加载设置,然后在初始化中启动空闲计时器以加载程序包。我会这样做undo-tree-mode
,ido
而其他人则永远不会注意到延迟,因为在我实际需要使用它们时,它们已经加载了。
更新:use-package有所更改,请在开始使用计时器功能之前阅读官方自述文件。
例如:如果您想稍微延迟加载时间,global-undo-tree-mode
可以将其放在您的init中:
(run-with-idle-timer 1 nil (lambda () (global-undo-tree-mode t)))
现在,您的初始化可以继续愉快地进行,global-undo-tree-mode
直到其他所有内容准备就绪并且您处于方向盘之后,才会真正被激活。
use-package
支持使用:idle关键字内置的这种行为。这是undo-tree
我的.init.el 的配置:
(use-package undo-tree
:idle (global-undo-tree-mode 1)
:bind (("C-c j" . undo-tree-undo)
("C-c k" . undo-tree-redo)
("C-c l" . undo-tree-switch-branch)
("C-c ;" . undo-tree-visualize))
:ensure t)
剖析您的init,看到真正的减速在哪里总是令人惊讶的。profile-dotemacs.el是一个了不起的工具,我曾用它来帮助我将初始化过程从〜6秒降低到<1秒。
配置良好的use-package
初始化可能会非常快。我不对自己的init进行字节编译,它用于use-package
配置95个程序包,并在<1秒内启动。
(require 'org)
线。:-)
(run-with-idle-timer 1 nil #'global-undo-tree-mode)'. If the function you are loading takes parameters you can just provide them after the
#'`命令。
最近在emacs reddit上弹出的内容:将其放在init文件的开头附近,以减少垃圾回收调用的次数:
(setq gc-cons-threshold 50000000)
(add-hook 'emacs-startup-hook 'my/set-gc-threshold)
(defun my/set-gc-threshold ()
"Reset `gc-cons-threshold' to its default value."
(setq gc-cons-threshold 800000))
在上面的示例中,GC每〜50MB(而不是默认值〜800kb)被调用一次,这在具有大量RAM的现代系统上似乎是明智的。
emacs-startup-hook
是个好地方。
您花费在优化启动时间上的时间可能要比等待Emacs启动所需的所有额外时间都要长。
目前,我require
在初始化文件中进行了25次调用,以便Flycheck可以在我的代码中发现拼写错误。我的启动时间是...
$ time emacs --eval '(save-buffers-kill-terminal)'
real 0m2.776s
user 0m2.305s
sys 0m0.148s
另外,我的系统上,time emacs -Q --eval '(save-buffers-kill-terminal)'
有一个real
的0m0.404s
。我可以节省的理论上最大时间为2.3秒。
假设我花了一个小时对初始化文件进行所有优化。(我不会计算稍后花费的额外15-30分钟时间,以弄清为什么由于我的init文件被字节编译而导致我的更改未生效。)(我也不会计算该时间如果我没有删除require
呼叫,Flycheck会把我保存在调试器中。)一个小时中有3600秒,因此,如果我节省了整整2.3秒,那么我的时间投入只有在1565个创业公司之后才能得到回报。
假设我每天重新启动Emacs 3次,那么每天需要花费一年半的时间才能收回投资。如果我一次使同一个Emacs实例一次运行几天(就像我经常做的那样),那么我大概每周只能重启2-5次,在这种情况下,这笔投资需要6到15年的时间才能收回。
我很慷慨,因为您可能要花一个多小时来优化启动,而且您可能不会节省理论上的最大秒数。