Criação de perfil do tempo de inicialização do Vim

139

Eu tenho muitos plugins ativados ao usar o Vim - eu colecionei plugins ao longo dos anos. Estou um pouco cansado de quanto tempo o Vim leva para começar agora, então gostaria de analisar sua inicialização e ver quais dos muitos plugins que tenho são responsáveis.

Existe alguma maneira de criar um perfil da inicialização ou execução de scripts do Vim? Idealmente, eu gostaria de saber quanto tempo o Vim gasta em cada script do Vim que ele carrega.

Benj
fonte

Respostas:

188

Se você estiver usando o Vim 7.2.269 ou posterior, existe a opção --startuptime que você pode usar.

vim --startuptime vim.log

da ajuda ( vim -h):

--startuptime <file> Write startup timing messages to <file>
jamessan
fonte
4
E no patch 7.2.286, não há sinal de igual necessário. "vim --startuptime vim.log"
jamessan 11/11/2009
25
se você quiser imprimi-lo, tente #vim --startuptime /dev/stdout +qall
Capi Etheriel 15/01
@barraponto Há também time vim +qse você deseja apenas programar a inicialização do vim como um todo.
Braden Best
No meu terminal, há uma diferença significativa entre vim --startuptime /dev/stdout +qalle vim --startuptime vim.log +qall; cat vim.log.
Hotschke 04/04
40

Você pode usar o próprio mecanismo de criação de perfil do vim:

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

Após executar o procedimento acima, você encontrará um arquivo chamado profile.log no diretório atual com todas as informações necessárias. Para obter uma tabela de informações por script semelhante à já apresentada por função, use (depois de abrir este arquivo no 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])'))

Ele não será classificado, mas você sempre poderá usar o :sortcomando interno se o número de scripts for muito grande.

ZyX
fonte
Eu não sabia que o vim tinha um comando de criação de perfil, obrigado por apontar isso.
Benj
@Benj Pode ser desativado. De acordo com o documento, você precisa do vim com um conjunto enorme de recursos ou um auto-compilado no qual ativou explicitamente o perfil + sem ativar esse conjunto.
ZyX 02/12/19
2
Seria +3 isso se eu pudesse. Ele me ajudou a rastrear um check-in dbext.vim, que estava tomando mais de três segundo github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb
@ ZyX, como posso fazer isso no shell do Windows (gvim)? Não funciona no windows gvim. Eu inseri este comando no shell do Windows gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Ele cria muitos arquivos vazios no vim.
Reman
@Remonn Use aspas duplas. Ou bash de cygwin.
ZyX 17/08/13
39

Criei este projeto no Github para responder melhor à sua pergunta. Basicamente, resume o tempo de cada chamada de função para todos os plugins, o que não é óbvio (mas importante) da saída do perfil bruto do vim. Bash, Python, R, Ruby são suportados para criar os resultados de criação de perfil.

Você obterá um resultado como este:

figura vim-plugins-profile

Junto com a saída de texto como esta:

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
fonte
Não pude adicionar números devido à baixa reputação. Você pode adicionar a figura simplesmente adicionando um !antes da tag.
Hyiltiz 18/10/2015
2
+1 Isso é muito legal ;-) Minha pergunta tem 6 anos agora (difícil de acreditar), então espero que você esteja fazendo isso mais para seu benefício do que para o meu. Ainda assim, tenho certeza de que será útil para outros espectadores da pergunta, que tem sido surpreendentemente popular.
19415 Benj
1
@ Benj Sim, eu estava tentando fazer o perfil, então encontrei sua pergunta. Não fiquei satisfeito com as respostas e apenas fiz algumas melhorias. Acredito que 6 anos muda um pouco a tendência - é muito conveniente obter gráficos de doces!
Hyiltiz 19/10/2015
Muito agradável! verifiquei meu vim também,> 60 ms ^ ^ Isso pode ajudá-lo a encontrar rapidamente o pacote que reduz a velocidade um monte (que no meu caso é ainda nada: D).
SidOfc
21

Você pode executar vim -V, canalizar a saída através de um utilitário que adiciona carimbos de data e hora e analisa a saída. Esta linha de comando faz isso, por exemplo:

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

Pode ser necessário digitar às cegas :qpara retornar ao prompt. Posteriormente, você deve encontrar o arquivo vilogem seu diretório atual com registros de data e hora no início de cada linha.

Se você pode fazer uma granularidade de segundo, pode fazer o seguinte:

vim -V 2>&1 | perl -ne 'print time, ": ", $_' | tee vilog
innaM
fonte
1
Fantástico, que ótima solução.
6119 Benj
3
Você sabia que o "perl -n" faz o tempo (<>) {} para você.
6119 Benj
1
Agora que você mencionou: sim, eu fiz. Vou editar a resposta para obter comandos mais curtos. Obrigado.
innaM
20

Com base no trabalho realizado por @hyiltiz que depende de R, criei uma versão em Python do criador de perfil, uma vez que isso está mais frequentemente disponível em um sistema que R.

Também é um pouco mais fácil de estender, portanto, os recursos são:

  • Detecção automática da pasta do plug-in,
  • Gráfico de barras graças ao matplotlib,
  • Execute a análise em várias execuções para obter o desvio médio / padrão ,
  • Suporta vim e neovim ,
  • Pode ser usado com um comando vim completo para testar recursos de carregamento lento, abrir um arquivo com um tipo de arquivo específico etc.,
  • Exporte o resultado para um arquivo csv.

A saída é semelhante ao que o vim-plugins-profile fornece:

$ 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-profiler

BenC
fonte
Este plugin não funciona para janelas neovim. A mensagem de erro é No plugin found.
Jdhao
16

Refinei a solução vim -V da innaM para mostrar o tempo delta:

vim -V 2>&1 | perl -MTime::HiRes=time -ne '$a = time unless defined $a; print time - $a, ": ", $_' | tee vilog
Benj
fonte
1
Doce! Tomei a liberdade de encurtar um pouco isso e torná-lo mais "Perlish".
innaM
5

Se você estiver carregando seus plugins a partir de um arquivo .vimrc, o que você poderia fazer é colocar uma qparte do arquivo no meio do arquivo para que ele saia, para que você possa usar um timer de processo, como o timecomando unix . Mais detalhadamente, isso seria semelhante a:

  1. fazer backup do .vimrcarquivo existente
  2. comentar todos, exceto um número selecionado de plugins
  3. insira uma qlinha
  4. ligue time vimrepetidamente e média
  5. restaurar backup

Isso não é elegante, mas acho que vai fazer o trabalho.

David Berger
fonte
Hmm, nada mal em uma pitada. Eu já tenho meu vimrc dividido em muitos arquivos separados, portanto não deve ser muito difícil de automatizar.
214 Benj
1

Pode ser conveniente rastrear o --startimearquivo ao abrir um arquivo específico

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

Não existe um timecomando bash que possa ser usado assim:

time vim

EDIT : Não inclui os scripts de inicialização. Use a sugestão @jamessan.


fonte
Sim, existe, mas isso indicaria apenas quanto tempo o vim levou para abrir e fechar, não quanto tempo levou para analisar cada script.
Benj