Como detectar plug-ins que tornam o Vim lento

O Vim trata de ajustar ~/.vimrce usar seu próprio conjunto de plug-ins para otimizar seu fluxo de trabalho. No entanto, de vez em quando, você pode acabar com alguns problemas de desempenho no Vim, muitas vezes porque você se esqueceu de definir alguns parâmetros de plug-in adequados.

Primeiro, você pode analisar o processo de inicialização do Vim executando o Vim com o seguinte comando:

$ vim --startuptime startup.report 

(cf. esta resposta SO )

Isso gerará um relatório simples com todos os scripts originados e o tempo que leva em milissegundos.

Em segundo lugar, você provavelmente também deseja depurar algumas ações específicas no Vim (por exemplo, ao trocar de buffers). Para isso, você pode usar o suporte de criação de perfil integrado do Vim:

:profile start profile.log
:profile func *
:profile file *
" At this point do slow actions
:profile pause

:noautocmd qall!

(cf. esta resposta SO )

Isso lhe dará um relatório exaustivo: todas as funções que foram chamadas, quantas vezes foram chamadas, quanto tempo foi gasto em cada uma delas etc. Isso me permitiu detectar um enorme gargalo no YouCompleteMe, sendo o culpado py ycm_state.OnBufferVisit().

FUNCTIONS SORTED ON TOTAL TIME
count total
(s) self (s) function
1 0.711777 0.710257 <SNR>165_OnBufferVisit()
1 0.011279 0.000039 <SNR>60_on_window_changed()
1 0.011201 0.000212 airline#update_statusline()
2 0.010989 0.000178 <SNR>61_invoke_funcrefs()
2 0.010571 0.000241 airline#util#exec_funcrefs()
2 0.009791 0.000228 airline#extensions#default#apply()
8 0.009306 0.000683 airline#check_mode()
FUNCTION  <SNR>165_OnBufferVisit()
Called 1 time
Total time: 0.711777
Self time: 0.710257

count total
(s) self (s)
" We need to do this even when we are
"
not allowed to complete in the current
" file because we might be allowed to
"
complete in the future! The canonical
" example is creating a new buffer with
"
:enew and then setting a filetype.
1 0.000029 0.000015 call s:SetUpYcmChangedTick()

1 0.000061 0.000018 if !s:AllowedToCompleteInCurrentFile()
return
endif


1 0.000054 0.000015 call s:SetUpCompleteopt()
1 0.000280 0.000015 call s:SetCompleteFunc()
1 0.710161 py ycm_state.OnBufferVisit()
1 0.001182 0.000023 call s:OnFileReadyToParse()

Isso também pode ser usado para traçar o perfil do processo de inicialização:

$ vim --cmd 'profile start profile.log' 
--cmd 'profile func *'
--cmd 'profile file *'
-c 'profdel func *'
-c 'profdel file *'
-c 'qa!'

Observe que o Vim precisa ser compilado com os sinalizadores apropriados. Você pode verificar se essas opções estão realmente disponíveis executando:

$ vim --version | grep +startuptime >& /dev/null && echo "startuptime available"  || echo "startuptime not available"
$ vim
--version | grep +profile >& /dev/null && echo "profile available" || echo "profile not available"