分析Vim启动时间

Ben*_*enj 125 debugging vim optimization profiling

使用Vim时我已经启用了很多插件 - 多年来我收集了插件.我有点厌倦了Vim现在需要多长时间,所以我想介绍一下它的启动,看看我有哪些插件负责.

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

jam*_*san 168

如果您使用的是Vim 7.2.269或更高版本,则可以使用--startuptime选项.

vim --startuptime vim.log
Run Code Online (Sandbox Code Playgroud)

来自help(vim -h):

--startuptime <file> Write startup timing messages to <file>
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要它只是打印它,试试`vim --startuptime/dev/stdout + qall` (25认同)
  • 从补丁7.2.286开始,不需要等号."vim --startuptime vim.log" (4认同)
  • @barraponto 如果您只想为整个 vim 的启动计时,还有 `time vim +q`。 (3认同)

ZyX*_*ZyX 37

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

vim --cmd 'profile start profile.log' \
    --cmd 'profile func *' \
    --cmd 'profile file *' \
    -c 'profdel func *' \
    -c 'profdel file *' \
    -c 'qa!'
Run Code Online (Sandbox Code Playgroud)

运行上述内容后,您将在当前目录中找到名为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])'))
Run Code Online (Sandbox Code Playgroud)

它将是未排序的,但:sort如果脚本数量太大,您可以始终使用内置命令.

  • 如果可以,我会+3.它帮助我找到了`dbext.vim`中的一张支票,这个支票花了三秒钟https://github.com/johnsyweb/dotfiles/commit/09c3001 (2认同)

hyi*_*tiz 35

我创建了这个 Github项目,以便更好地回答您的问题.基本上,它总结了每个插件的每个函数调用的时间,这对于原始vim配置文件输出来说并不明显(但很重要).

您将获得如下结果数字:

vim-plugins-profile图

与文本输出一样:

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!    
Run Code Online (Sandbox Code Playgroud)

  • +1这很酷;-)我的问题现在是6岁(很难相信)所以我希望你为了你的利益而做的比我的更多.尽管如此,我相信这对于这个问题的其他观众来说也是有用的,这个观众非常受欢迎. (2认同)

inn*_*naM 20

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

vim -V 2>&1 | perl -MTime::HiRes=time -ne 'print time, ": ", $_' | tee vilog
Run Code Online (Sandbox Code Playgroud)

您可能需要盲目输入:q以返回到提示符.之后,您应该vilog在当前目录中找到该文件,并在每行的开头雇用时间戳.

如果您可以使用一秒钟的粒度,则可以执行以下操作:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
Run Code Online (Sandbox Code Playgroud)

  • 您是否知道"perl -n"为您执行while(<>){}. (3认同)

Ben*_*enj 16

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

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
Run Code Online (Sandbox Code Playgroud)


Ben*_*enC 16

基于@hyiltiz完成的依赖于R的工作,我制作了一个Python版本的探查器,因为这在R系统上更常见.

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

  • 自动检测插件文件夹,
  • 条形图感谢matplotlib,
  • 在几次执行中运行分析以获得平均值/标准差,
  • 支持vimneovim,
  • 可以与完整的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
=====================================
Run Code Online (Sandbox Code Playgroud)

VIM-分析器


Dav*_*ger 5

如果您从.vimrc文件加载插件,那么您可以做的是q在文件的某个部分放置一些文件以使其退出,这样您就可以使用进程计时器,例如unix time命令.更彻底的是,这看起来像:

  1. 备份现有.vimrc文件
  2. 注释掉除了一定数量的插件之外的所有插件
  3. 插入一条q线
  4. 呼叫time vim重复和平均
  5. 恢复备份

这不优雅,但我认为它将完成工作.