分析Vim启动时间


139

使用Vim时,我启用了许多插件–多年来,我已经收集了插件。我有点厌倦了Vim现在开始需要多长时间,所以我想介绍一下它的启动情况,并查看我负责的许多插件中的哪一个。

有什么方法可以描述Vim的启动或脚本运行吗?理想情况下,我想知道Vim在加载的每个Vim脚本中花费了多长时间。

Answers:


188

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

vim --startuptime vim.log

通过帮助(vim -h):

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

4
从7.2.286版本开始,就不需要等号了。“ vim --startuptime vim.log”
jamessan

25
如果您只想打印它,请尝试vim --startuptime /dev/stdout +qall
Capi Etheriel

@barraponto还有,time vim +q如果您只想计时整个vim的启动时间。
Braden Best

在我的终端机上,vim --startuptime /dev/stdout +qall和之间有很大的区别vim --startuptime vim.log +qall; cat vim.log
Hotschke

40

您可以使用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有配置文件命令,感谢您指出这一点。
2011年

@Benj可以禁用。根据文档,您要么需要具有大量功能的vim,要么需要自行编译的vim,在其中您明确启用+ profile而不启用此功能。
ZyX 2011年

2
如果可以的话,将+3。它帮助我追踪了一次检查dbext.vim,这花费了三秒钟的时间github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb 2013年

@ZyX,如何在Windows Shell(gvim)中执行此操作?在Windows gvim中不起作用。我在Windows shell中插入了此命令,gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'它确实在vim中创建了很多空文件。
Reman 2013年

@Remonn使用双引号。或从cygwin扑灭。
ZyX

39

我创建了这个 Github项目是为了更好地回答您的问题。基本上,它总结了每个插件的每个函数调用的时间,从原始vim配置文件输出来看,这不是很明显(但很重要)。支持Bash,Python,R,Ruby创建分析结果。

您将获得如下结果图:

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!    

由于声誉低下,我无法添加数字。您可以通过!在标记之前添加一个来添加图中的内容。
hyiltiz

2
+1这很酷;-)我的问题已经6岁了(很难相信),所以我希望您这样做对您有好处,而不是我的。不过,我敢肯定,这对于其他已广受欢迎的问题的观众来说将是有用的。
2015年

1
@Benj是的,我试图自己进行分析,然后找到您的问题。我对答案不满意,只是做了一些改进。我相信6年的时间会改变趋势-获得糖果图非常方便!
hyiltiz 2015年

非常好!也检查了我的vim,> 60 ms ^。^这可以帮助您快速找到使您放慢速度的软件包(在我的情况下,它还是一无是处:D)
SidOfc

21

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

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

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

如果可以做到一秒钟的粒度,则可以执行以下操作:

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

1
太棒了,这是个很好的解决方案。

3
您是否知道“ perl -n”为您做了while(<>){}。

1
现在您提到了:是的,我做到了。我将编辑答案以获取更短的命令。谢谢。
innaM

20

基于@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
=====================================

vim分析器


该插件不适用于Neovim Windows。错误消息是No plugin found
jdhao

16

我通过innaM 优化了vim -V 解决方案,以显示变化时间:

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

1
甜!我冒昧地将其缩短了一点,使其更“ Perlish”。
innaM

5

如果要从.vimrc文件加载插件,则可以q在文件中的某些行上放置一行,以使其退出,从而可以使用进程计时器,例如unix time命令。更彻底地,这看起来像:

  1. 备份现有.vimrc文件
  2. 注释掉除选定数量的插件外的所有插件
  3. 插入q一行
  4. time vim反复呼叫并平均
  5. 恢复备份

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


嗯,还不错。我已经将我的vimrc拆分为许多单独的文件,因此自动化起来应该不太困难。


1

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

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

0

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

time vim

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


是的,确实有,但这只会告诉您打开和关闭vim花费了多长时间,而不是解析每个脚本花费了多长时间。
Benj 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.