分析 Vim 启动时间

我在使用 Vim 时启用了很多插件——这些年我收集了很多插件。我有点受够了 Vim 现在要花多长时间才能启动,所以我想分析一下它的启动情况,看看我有多少插件,哪些是我负责的。

有没有办法来分析 Vim 的启动或脚本运行?理想情况下,我想知道 Vim 在它加载的每个 Vim 脚本中花费了多长时间。

41636 次浏览

如果您从一个。Vimrc 文件中,您可以将 q放在文件的某个行部分,使其退出,这样您就可以使用进程计时器,比如 unix time命令。更彻底地说,这看起来像是:

  1. 备份现有的 .vimrc文件
  2. 注释掉所有的插件,除了一些选定的插件
  3. 插入 q线
  4. 反复调用 time vim并保持平均
  5. 恢复备份

这不是优雅的,但我认为它会完成工作。

您可以运行 vim -V,通过添加时间戳的实用程序管道输出,并分析输出。此命令行执行此操作,例如:

vim -V 2>&1 | perl -MTime::HiRes=time -ne 'print time, ": ", $_' | tee vilog

您可能必须盲目地键入 :q才能返回到提示符。然后,你应该在你的工作目录中找到 vilog文件,在每一行的开头都有雇佣时间戳。

如果你可以使用一秒的粒度,你可以这样做:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog

我通过 innaM 改进了 vim-V 解决方案来显示增量时间:

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog

如果您正在使用 Vim 7.2.269或更高版本,那么可以使用—— startuptime 选项。

vim --startuptime vim.log

从帮助(vim -h) :

--startuptime <file> Write startup timing messages to <file>

您可以使用 vim 自己的分析机制:

vim --cmd 'profile start profile.log' \
--cmd 'profile func *' \
--cmd 'profile file *' \
-c 'profdel func *' \
-c 'profdel file *' \
-c 'qa!'

运行以上命令后,你会在工作目录中找到一个名为 profile.log 的文件,其中包含了所有需要的信息。要获得类似于已经显示的每个函数的每个脚本信息表,请使用(在 vim 中打开该文件后) :

" Open profile.log file in vim first
let timings=[]
g/^SCRIPT/call add(timings, [getline('.')[len('SCRIPT  '):], matchstr(getline(line('.')+1), '^Sourced \zs\d\+')]+map(getline(line('.')+2, line('.')+3), 'matchstr(v:val, ''\d\+\.\d\+$'')'))
enew
call setline('.', ['count total (s)   self (s)  script']+map(copy(timings), 'printf("%5u %9s   %8s  %s", v:val[1], v:val[2], v:val[3], v:val[0])'))

它将是未排序的,但是如果脚本数量太多,总是可以使用内置的 :sort命令。

有一个插件,以配置文件的 vim 启动时间。

Http://www.vim.org/scripts/script.php?script_id=2915

有没有 bash time命令可以这样使用:

time vim

编辑 : 不包括脚本启动时间。使用@jamessan 建议。

打开特定文件时,可以方便地跟踪 --startime

gvim app/views/layouts/application.html.erb --startuptime time.log

为了更好地回答你的问题,我创建了 这个 Github 项目。基本上,它使用适当的标志和选项调用 vim的内置探查器,然后总结每个插件的每个函数调用的时间,这在原始 vim --profile输出中并不明显(但很重要)。为了创建分析结果,支持 Bash、 Python、 R、 Ruby 和 Perl (您不需要安装任何东西,因为您很可能已经安装了其中之一)。

你会得到这样一个结果:

vim-plugins-profile figure

还有这样的文本输出:

Generating vim startup profile...
Parsing vim startup profile...
Crunching data and generating profile plot ...


Your plugins startup profile graph is saved
as `profile.png` under current directory.


==========================================
Top 10 Plugins That Slows Down Vim Startup
==========================================
1    105.13  "vim-colorschemes"
2    42.661  "vim-easytags"
3    31.173  "vim-vendetta"
4    22.02   "syntastic"
5    13.362  "vim-online-thesaurus"
6    7.888   "vim-easymotion"
7    6.931   "vim-airline"
8    6.608   "YankRing.vim"
9    5.266   "nerdcommenter"
10    5.017   "delimitMate"
==========================================
Done!

基于取决于 R 的 @ Hyiltiz所做的工作,我制作了一个分析器的 Python 版本,因为这在 R 的系统上更常用。

它也更容易扩展,因此功能是:

  • 自动检测插件文件夹,
  • 多亏了 matplotlib,
  • 分析几次执行情况得到 平均/标准差,
  • 同时支持 Vim新语言,
  • 可以与 全面命令一起用来测试延迟加载特性,用特定的文件类型打开文件等等,
  • 将结果导出到一个 csv 文件。

输出与 vim-plugins-profile 提供的类似:

$ vim-profiler.py -p nvim


Running nvim to generate startup logs... done.
Loading and processing logs... done.
Plugin directory: /home/user/.config/nvim/plugged
=====================================
Top 10 plugins slowing nvim's startup
=====================================
1         3.326   vim-fugitive
2         2.936   tcomment_vim
3         2.315   vim-hybrid
4         1.751   lightline.vim
5         0.959   vim-sneak
6         0.943   supertab
7         0.542   vim-surround
8         0.536   fzf.vim
9         0.450   fzf
10        0.434   auto-pairs
=====================================

vim-profiler

另一个命令行 util 分析写入的 vim 启动时间。

来自 GitHub 页面:

$vim-startuptime

默认情况下,它尝试运行 vim 并且: 立即退出10次,收集结果并将它们的摘要输出到 stdout。

Https://github.com/rhysd/vim-startuptime