Vim 시작 시간 프로파일 링


139

Vim을 사용할 때 많은 플러그인을 사용하도록 설정했습니다. 몇 년 동안 플러그인을 수집했습니다. Vim이 지금 시작하는 데 걸리는 시간에 약간의 불만이 있으므로 시작을 프로파일 링하고 내가 담당하는 많은 플러그인 중 하나를보고 싶습니다.

Vim의 시작 또는 스크립트 실행을 프로파일 링하는 방법이 있습니까? 이상적으로는 Vim 이로 드하는 각 Vim 스크립트에서 Vim이 얼마나 오래 지속되는지 알고 싶습니다.

답변:


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 2009

25
그냥 인쇄하고 싶다면vim --startuptime /dev/stdout +qall
Capi Etheriel

@barraponto time vim +qvim의 시작 시간 전체를 원하는 경우도 있습니다.
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이 프로파일 링 명령을 가지고 있다는 것을 몰랐다.
Benj

@Benj 비활성화 할 수 있습니다. 이 문서에 따르면 거대한 기능 세트가있는 vim이 필요 하거나이 세트를 활성화하지 않고 + 프로파일을 명시 적으로 활성화 한 자체 컴파일 기능이 필요합니다.
ZyX

2
내가 할 수 있다면 이것을 +3 하시겠습니까? 그것은 나를에 체크 추적 도움이 dbext.vim세 가지 초 이상을 복용 한, github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb

@ ZyX, Windows 쉘 (gvim)에서 어떻게 할 수 있습니까? Windows gvim에서는 작동하지 않습니다. 이 명령을 Windows 셸에 삽입했습니다 gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'. vim에 많은 빈 파일이 만들어집니다.
Reman

@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 살이다. 그래도이 질문이 다른 인기있는 질문에 유용 할 것이라고 확신합니다.
Benj

1
@Benj 네, 프로파일 링을 직접하려고했는데 질문을 찾았습니다. 나는 대답에 만족하지 않고 단지 약간의 개선을했습니다. 6 년 동안 트렌드가 약간 바뀌 었다고 생각합니다. 사탕 그래프를 얻는 것이 매우 편리합니다!
hyiltiz

아주 좋아요! 너무 내 정력을 확인,> 60 밀리 초 ^이 빠르게 패키지를 찾을 수 있습니다 ^이 (내 경우에는 여전히 아무것도 : D) 많은 속도가 느려집니다 당신을.
SidOfc

21

vim -V타임 스탬프를 추가하고 출력을 분석하는 유틸리티를 통해 출력을 파이프하고 실행할 수 있습니다 . 이 명령 행은 다음을 수행합니다. 예 :

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

:q프롬프트로 돌아가려면 맹목적으로 입력해야 할 수도 있습니다 . 그런 다음 vilog각 줄의 시작 부분에 고용 타임 스탬프가있는 현재 디렉토리에서 파일 을 찾아야합니다 .

1 초 단위로 수행 할 수있는 경우 다음을 수행 할 수 있습니다.

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

1
환상적이고 훌륭한 솔루션입니다.
Benj

3
"perl -n"이 잠시 동안 (<>) {}을 수행한다는 것을 알고 있습니까?
Benj

1
이제 당신이 그것을 언급했습니다 : 예, 했어요. 더 짧은 명령을 얻기 위해 답을 편집하겠습니다. 감사.
innaM

20

R에 의존 하는 @hyiltiz 가 수행 한 작업을 기반으로 필자는 프로파일 러 의 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-profiler


이 플러그인은 neovim 창에서 작동하지 않습니다. 오류 메시지는 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 vimrepeteadly 평균
  5. 백업 복원

이것은 우아하지 않지만 작업이 완료 될 것이라고 생각합니다.


흠, 꼬집음에 나쁘지 않습니다. 나는 이미 vimrc를 많은 별도의 파일로 분할 했으므로 자동화하기가 너무 어렵지 않아야합니다.
Benj


1

--startime특정 파일을 열 때 추적하는 것이 편리 할 수 ​​있습니다

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

0

다음 time과 같이 사용할 수 있는 bash 명령 이 없습니까?

time vim

편집 : 스크립트 시작 시간을 포함하지 않습니다. 대신 @jamessan 제안을 사용하십시오.


예, vim이 각 스크립트를 파싱하는 데 걸리는 시간이 아니라 열려 있고 닫는 데 걸린 시간을 알려줍니다.
Benj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.