如何查看导致Vim变慢的插件?

370

有没有一种方法来分析 Vim 插件的性能表现?

当我打开一个大的.py文件时,我的 MacVim 变得越来越慢。我知道我可以取消选择所有插件,然后逐个重新选择来确定是哪个插件导致了问题,但是否有更快的方法呢?

我的 dotvim 仓库在这里:https://github.com/charlax/dotvim


4
请参考https://dev59.com/wnI-5IYBdhLWcg3wwbZM,该链接为如何分析Vim启动时间的问题。 - chelmertz
2
实际上,启动很好。使用几分钟后,Vim会变得很慢。这尤其涉及到.py文件。 - charlax
二分查找是最好的选择。你在两个小时前提出了问题,如果当时使用二分查找,就可以找到问题的原因了。Ingo Karkat的autocmd猜测对我来说是最有可能的。 - romainl
2
没错 - 但是你不觉得如果有一种方法可以在一个小时内获得相同的结果,那不是更好吗?而且,启动很好,只是在使用几分钟后,它会花费很长时间。autocmd看起来很酷。我刚试过了,但现在Vim并不慢。 - charlax
1
刚遇到了同样的问题,但是在大型 Ruby 文件上。发现 folding=syntax 可能会减慢速度。尝试使用 folding=manual,现在一切正常。 - Aleksandr K.
6个回答

585

你可以使用内置的性能分析支持:启动 vim 后执行以下操作:

:profile start profile.log
:profile func *
:profile file *
" At this point do slow actions
:profile pause
:noautocmd qall!

(与退出noautocmd不同,使用它并不是必须的,只是使vim更快地退出)。

注意:您将无法获取有关在vim退出之前被删除的函数的信息。


15
太棒了!我能够看出EasyTags是罪魁祸首。非常感谢! - charlax
7
这帮助我检测到“vim-gitgutter”是瓶颈。 - Sebastián Grignoli
6
@subjectego:使用命令 :set more | verbose function {function_name} 可以显示函数的内容及其所在位置。 - ZyX
32
如果不清楚的话,生成的profile.log文件是在你当前Vim会话目录中的一个文件。 - Micah Smith
15
跳到 profile.log 的末尾以查看按总时间排序的函数列表(在我发现末尾有一个排序列表之前,profile.log 对我来说似乎毫无用处)。 - Andrey Portnoy
显示剩余19条评论

93
我发现另一个非常有用的vim内置方法,可以在加载你的.vimrc文件时显示确切的时间消息。
vim --startuptime timeCost.txt timeCost.txt

请执行:

:help --startuptime

在VIM中获取更多信息。


3
以防有其他人也在想,这并不是所有 vim/gvim 发行版都存在的。在我的电脑上,标准的 Win Gvim 7.4 版本没有这个功能(尽管在 viminfo 中有记录)。 - thynctank
1
@thynctank 我在我的gvim 7.4上尝试了一下,它可以工作。这是我的版本 IM - Vi IMproved 7.4 (2013年8月10日,编译于2013年8月10日14:33:40) - feihu
最佳答案!帮助我识别了最慢的插件,让我每次启动vim都感到很生气。谢谢 :) - kovpack
这个和基本的“-V”显示出来,问题是由一个非本地的“$HOME”引起的。 - bsb
你需要执行 :e 命令来刷新文件。按照每个操作所花费的总时间对文件进行原地排序,命令如下::%! sort -k2 -nr - Ashutosh Jindal
这帮助我找出了慢启动的罪魁祸首 X11 转发。在终端中禁用后,它就正常工作了。 - Validus Oculus

31

当 Vim 出现插件或语法高亮问题时,可以尝试使用 :syntax off 命令,看看是否能够使 Vim 立即变得更快。

如果是由插件导致的“普遍缓慢”,通常是由于自动命令引起的。使用 :autocmd 命令可以列出所有自动命令。通过使用 :autocmd! [group] {event} 命令来逐个删除自动命令并进行调查。从更频繁的事件(例如 CursorMoved[I])开始,逐渐向不太频繁的事件(例如 BufWinEnter)前进。

如果您可以在某种程度上可靠地重现缓慢的情况,则可以尝试二分搜索:将 ~/.vim/plugin/ 目录中的文件分成两半,然后分别测试,重复操作直到找到导致缓慢的文件集合。

如果您确实需要深入了解,可以获取支持 :profile 命令的 Vim 版本。 (不是原版的 Windows 版本,但附带 Cygwin 的版本具有此功能;此外,在大多数发行版下进行自编译非常容易。)


18

我发现通过使用Vim的-V选项将所有Vim操作打印到文件中很有帮助:

vim -V12log

这提供了最大的详细程度(级别12),并将其输出到文件log。然后,您可以执行一些您知道很慢的Vim操作,然后查看内部调用哪些函数/映射。


11
但是日志上没有时间记录。 - Kokizzu

13

如果您在屏幕更新操作(^L,滚动等)方面遇到问题,可能是由于语法高亮文件效率低下所致。您可以通过暂时禁用语法高亮(:syn off)来测试是否存在问题;如果您想深入了解细节,可以使用:syntime对当前语法文件进行分析:

  1. 打开导致语法高亮性能问题的文件。
  2. 运行:syntime on开始分析。
  3. 浏览文件一段时间。
  4. 运行:syntime report生成报告。报告中排名靠前的模式是处理时间最长的模式。

4
如果似乎是语法高亮文件引起的问题,下一步该怎么办? - Spectator6

1
一个非常简单的解决方案:找到一个缓慢的命令。将一个插件移动到/tmp/。再次尝试该命令。如果仍然很慢,请将另一个插件移动到/tmp/。重复此过程,直到找到导致命令变慢的插件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接