为什么Windows下的Emacs这么慢?
这个问题经常见,总结一下我知道的原因。写这个总结主要是方便今后回答Emacs社区里的提问。
字体Bug
对于中文用户来说,字体Bug会导致Emacs变慢。这种情况常见于刚开始使用Emacs的新手,也给很多人造成了Emacs很慢的印象。如果您的Emacs在Windows下很卡50%的可能是这个Bug导致的,如果您是新手,可能性上升到80%。
解决方法:合理设置字体。
进程模式和IO策略
Windows和GNU/Linux毕竟是两种不同的操作系统。GNU/Linux以及其他的*nix系统里,进程的启动非常快,处理大量的IO很快;而Windows正好相反,进程启动慢,对于大量数据量少的IO也慢。这个原因导致Emacs在Windows下操作文件和运行外部程序的时候慢。一个典型的例子是Magit,因为需要频繁启动Git,每个操作都要等好几秒。还有Tramp,我感觉也是频繁启动外部程序拖慢的。
另外,不论是Cygwin环境的Emacs还是用MinGW编译出来的Emacs,依赖的都不是微软的运行时,和系统自带的已经预先加载的DLL不同,也会导致Emacs以及其他程序变慢,这种慢主要体现在启动的时候。
总得来说,这个原因占30%的情况。
解决方法:貌似没有什么好的解决方案,只能对于具体的包和操作进行一些优化,可专注于优化Emacs在Windows下的体验的开发者太少了,而且根据Emacs的开发目标也确实不应该为Emacs做这种优化。
关于这个问题Reddit上有相关讨论。
缺少功能
上面的两个问题是慢的主要原因,下面的都是些小问题,也不同程度拖慢Emacs。首先Windows系统缺少一些Emacs需要的功能,比如运行shell的时候只能用管道,因为没有PTY,也是慢的原因。
解决方法:这个问题很多时候是无解的。
键盘重复率
Windows的键盘重复率不能设的非常快,有个上限,也给人很慢的感觉,比如你用C-f
光标向前,如果重复率慢,光标走的就慢了,而在Linux下虽然图形界面的效率可能低一点,但键盘快,你也就觉得快。这个问题我感觉无解,不知道萎软怎么想的。
图形界面
因为Emacs是移植到Windows上的,开发者关注少,等等原因,图形界面方面也慢一点。这种慢我感觉是比较次要的,毕竟现在的电脑速度都很快了。
编译
以前的Emacs版本特别是官方的,用的是开发不活跃的MinGW环境编译的,GCC版本和编译参数都跟不上,也导致慢。现在的版本基于MSYS2/MinGW-w64,编译参数也好了,这个问题基本解决了。
病毒、杀毒软件等
Windows系统偶尔会遇到这类问题。
总得来说,慢是可以预期的,是可以解释的,也可以部分解决。要想用的爽,早日拥抱自由的系统是正道。
或者您可以把评论发在别处,添加指向本页的连接,然后把网址告诉我:
本文标题:为什么Windows下的Emacs这么慢?
文章作者:Chris
发布时间:2018-07-12
最后更新:2022-03-23
原始链接:https://chriszheng.science/2018/07/12/Why-is-Emacs-so-slow-on-Windows/
版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明出处!
分享