If you're using Vim 7.2.269 or later, then there's the --startuptime option you can use.
vim --startuptime vim.log
from the help (vim -h
):
--startuptime <file> Write startup timing messages to <file>
I created this Github project in order to better answer your question. Basically, it calls vim
's built-in profiler with appropriate flags and options, then sums up the timing for each function calls for every plugins, which is not obvious (but important) from the raw vim --profile
output. Bash, Python, R, Ruby and Perl are supported (you don't need to install anything since you most likely have one of those already) for creating the profiling results.
You will get a result figure like this:
Along with text output like this:
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!
You can use vim own profiling mechanism:
vim --cmd 'profile start profile.log' \
--cmd 'profile func *' \
--cmd 'profile file *' \
-c 'profdel func *' \
-c 'profdel file *' \
-c 'qa!'
After running the above you will find a file called profile.log in the current directory with all required information. To get per-script information table similar to already present per-function one, use (after opening this file in 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])'))
It will be unsorted, but you can always use built-in :sort
command if number of scripts is too large.
You could run vim -V
, pipe the output through a utility that adds timestamps and analyze the output. This command lines does this, e.g.:
vim -V 2>&1 | perl -MTime::HiRes=time -ne 'print time, ": ", $_' | tee vilog
You might have to blindly type :q to get back to your prompt. Afterwards, you should find the file vilog
in your current directory with hires timestamps at the beginning of each line.
If you can do with a granularity of a second, you can do this:
vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
Based on the work done by @hyiltiz that depends on R, I made a Python version of the profiler, since this is more often available on a system that R.
It's also slightly easier to extend, thus the features are:
The output is similar to what vim-plugins-profile provides:
$ 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
=====================================
I refined the vim -V solution by innaM to show the delta time:
vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
If you're loading your plugins from a .vimrc file, what you could do is put a q
on some line part way through the file to make it quit so you can use a process timer, like the unix time
command. More thoroughly, this would look like:
.vimrc
fileq
linetime vim
repeteadly and averageThis is not elegant but I think it will get the job done.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With