【发布时间】:2010-12-13 20:29:43
【问题描述】:
我在使用 Vim 时启用了很多插件——这些年来我一直在收集插件。我有点厌倦了 Vim 现在需要多长时间才能启动,所以我想分析一下它的启动情况,看看我拥有的众多插件中的哪一个负责。
有什么方法可以分析 Vim 的启动或脚本运行情况?理想情况下,我想知道 Vim 在它加载的每个 Vim 脚本中花费了多长时间。
【问题讨论】:
标签: debugging optimization vim profiling
我在使用 Vim 时启用了很多插件——这些年来我一直在收集插件。我有点厌倦了 Vim 现在需要多长时间才能启动,所以我想分析一下它的启动情况,看看我拥有的众多插件中的哪一个负责。
有什么方法可以分析 Vim 的启动或脚本运行情况?理想情况下,我想知道 Vim 在它加载的每个 Vim 脚本中花费了多长时间。
【问题讨论】:
标签: debugging optimization vim profiling
如果您使用的是 Vim 7.2.269 或更高版本,则可以使用 --startuptime 选项。
vim --startuptime vim.log
来自帮助 (vim -h):
--startuptime <file> Write startup timing messages to <file>
【讨论】:
vim --startuptime /dev/stdout +qall
time vim +q。
vim --startuptime /dev/stdout +qall 和 vim --startuptime vim.log +qall; cat vim.log 之间存在显着差异。
为了更好地回答您的问题,我创建了this Github 项目。基本上,它使用适当的标志和选项调用vim 的内置分析器,然后总结每个插件的每个函数调用的时间,这在原始vim --profile 输出中并不明显(但很重要)。支持 Bash、Python、R、Ruby 和 Perl(您不需要安装任何东西,因为您很可能已经拥有其中之一)来创建分析结果。
你会得到这样的结果图:
连同这样的文本输出:
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!
【讨论】:
! 即可在图中添加。
你可以使用vim自己的分析机制:
vim --cmd 'profile start profile.log' \
--cmd 'profile func *' \
--cmd 'profile file *' \
-c 'profdel func *' \
-c 'profdel file *' \
-c 'qa!'
运行上述程序后,您将在当前目录中找到一个名为 profile.log 的文件,其中包含所有必需的信息。要获得类似于已经存在的 per-function 的 per-script 信息表,请使用(在 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 命令。
【讨论】:
dbext.vim 的签入,这花费了三秒以上github.com/johnsyweb/dotfiles/commit/09c3001
gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!' 中插入了这个命令,它确实在 vim 中创建了很多空文件。
您可以运行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
【讨论】:
基于 @hyiltiz 所做的依赖于 R 的工作,我制作了一个分析器的 Python version,因为这在 R 的系统上更常见。
它也更容易扩展,因此功能是:
输出类似于 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
=====================================
【讨论】:
No plugin found。
我通过 innaM 改进了 vim -V solution 以显示增量时间:
vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
【讨论】:
如果你从 .vimrc 文件加载你的插件,你可以做的是在文件中的某行放置一个 q 以使其退出,这样你就可以使用进程计时器,比如 unix @ 987654322@ 命令。更彻底地说,这看起来像:
.vimrc文件q 行time vim 并进行平均这并不优雅,但我认为它可以完成工作。
【讨论】:
打开特定文件时可以很方便地追踪--startime
gvim app/views/layouts/application.html.erb --startuptime time.log
【讨论】:
有一个插件可以分析 vim 的启动时间。
【讨论】:
难道没有bash time 命令可以这样使用吗:
time vim
编辑:不包括脚本启动时间。请改用@jamessan 建议。
【讨论】: