Profiling Vim
I’ve been using a pretty popular dotfile repo, YADR, for quite some time now. I’ve used it for so long that I’ve even made contributions to the project here and there.
But sometimes, it slows down when performing certain tasks for no apparent reason. In particular, while making Ruby code examples for a presentation a few days ago, I noticed that opening/saving a ruby file took 3-5 seconds! Wanting my itch to be scratched, I decided to look for ways to profile the slowness away!
It’s really easy, just pop your vim open and type this in normal mode:
# save to ~/record.log
:profile start ~/record.log
# the profile for every function and file
:profile func *
:profile file *
# do whatever's slow action that you want to record, for example:
:open sample_ruby_file.rb
:profile pause
# required to quit to create ~/record.log
:qall
Next you can now check the bottom of ~/record.log
,
under “FUNCTIONS SORTED ON SELF TIME”:
...
FUNCTIONS SORTED ON SELF TIME
count total (s) self (s) function
3 0.042048 0.015790 <SNR>4_SynSet()
1 2.495415 0.014309 <SNR>31_LoadFTPlugin()
6 0.009933 0.004577 <SNR>227_line()
1 0.006000 0.003480 <SNR>32_LoadIndent()
12 0.003720 0.002310 <SNR>227_expand()
... and more
In my case, since 31_LoadFTPlugin
took 2 seconds, I went down the rabbit hole
of why this is slow and ended up in vim-ruby/ftplugin issues.
Luckily, it’s fixed in the latest vim-ruby. So I just had to update mine via :PluginUpdate vim-ruby
(for Vundler users).
So next time you see a large spike in your vim setup, profile the slowness away!
BONUS: Also, if your vim’s startup time is slow, you can still profile that with:
$ vim --startuptime time_cost.txt
There you have it! Happy fiddling around with vim!