Hồ sơ thời gian khởi động Vim


139

Tôi đã kích hoạt rất nhiều plugin khi sử dụng Vim - Tôi đã thu thập các plugin qua nhiều năm. Tôi hơi chán với việc Vim mất bao lâu để bắt đầu bây giờ, vì vậy tôi muốn lập hồ sơ khởi động của nó và xem những plugin nào tôi có trách nhiệm.

Có cách nào để lập hồ sơ khởi động hoặc chạy script của Vim không? Lý tưởng nhất là tôi muốn biết Vim dành bao lâu cho mỗi tập lệnh Vim mà nó tải.

Câu trả lời:


188

Nếu bạn đang sử dụng Vim 7.2.269 trở lên, thì có tùy chọn --startuptime bạn có thể sử dụng.

vim --startuptime vim.log

từ trợ giúp ( vim -h):

--startuptime <file> Write startup timing messages to <file>

4
Và kể từ bản vá 7.2.286, không cần có dấu bằng. "vim --startuptime vim.log"
jamessan

25
nếu bạn muốn nó chỉ in nó, hãy thửvim --startuptime /dev/stdout +qall
Capi Etheriel

@barraponto Cũng có time vim +qnếu bạn chỉ muốn toàn bộ thời gian khởi động của vim.
Braden tốt nhất

Trên thiết bị đầu cuối của tôi có một sự khác biệt đáng kể giữa vim --startuptime /dev/stdout +qallvim --startuptime vim.log +qall; cat vim.log.
Hotschke

40

Bạn có thể sử dụng cơ chế hồ sơ riêng của vim:

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

Sau khi chạy ở trên, bạn sẽ tìm thấy một tệp có tên profile.log trong thư mục hiện tại với tất cả các thông tin cần thiết. Để có được bảng thông tin cho mỗi tập lệnh tương tự như trình bày từng chức năng, hãy sử dụng (sau khi mở tệp này trong 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])'))

Nó sẽ không được sắp xếp, nhưng bạn luôn có thể sử dụng :sortlệnh tích hợp nếu số lượng tập lệnh quá lớn.


Tôi đã không nhận ra vim có một lệnh profiling, cảm ơn vì đã chỉ ra điều này.
Benj

@Benj Nó có thể bị vô hiệu hóa. Theo tài liệu, bạn có thể yêu cầu vim với bộ tính năng khổng lồ hoặc tự biên dịch trong đó bạn đã bật + hồ sơ rõ ràng mà không bật bộ này.
ZyX

2
Sẽ +3 cái này nếu tôi có thể. Nó giúp tôi theo dõi một kiểm tra dbext.vim, mất hơn ba giây github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb

@ZyX, Làm thế nào tôi có thể làm điều này trong shell windows (gvim)? Nó không hoạt động trong windows gvim. Tôi đã chèn lệnh này trong windows shell gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'Nó tạo ra rất nhiều tệp trống trong vim.
Reman

@Remonn Sử dụng dấu ngoặc kép. Hoặc bash từ cygwin.
ZyX

39

Tôi đã tạo dự án Github này để trả lời tốt hơn câu hỏi của bạn. Về cơ bản, nó tổng hợp thời gian cho mỗi hàm gọi cho mọi plugin, điều này không rõ ràng (nhưng quan trọng) từ đầu ra hồ sơ vim thô. Bash, Python, R, Ruby được hỗ trợ để tạo kết quả định hình.

Bạn sẽ nhận được một con số kết quả như thế này:

vim-plugins-profile hình

Cùng với đầu ra văn bản như thế này:

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!    

Tôi không thể thêm số liệu do danh tiếng thấp. Bạn có thể thêm vào hình bằng cách thêm một !trước thẻ.
hyiltiz

2
+1 Điều này khá tuyệt ;-) Câu hỏi của tôi bây giờ đã 6 tuổi (khó tin) vì vậy tôi hy vọng bạn làm việc này nhiều hơn vì lợi ích của bạn hơn là của tôi. Tuy nhiên, tôi chắc chắn rằng nó sẽ hữu ích cho những người xem câu hỏi khác, đã được phổ biến một cách đáng ngạc nhiên.
Benj

1
@Benj Vâng, tôi đã cố gắng tự làm hồ sơ, sau đó tìm thấy câu hỏi của bạn. Tôi không hài lòng với câu trả lời và chỉ thực hiện một số cải tiến. Tôi tin rằng 6 năm thay đổi xu hướng một chút - rất thuận tiện để có được biểu đồ kẹo!
hyiltiz

Rất đẹp! cũng đã kiểm tra vim của tôi,> 60 ms ^. ^ Điều này có thể giúp bạn nhanh chóng tìm thấy gói làm bạn chậm đi rất nhiều (trong trường hợp của tôi vẫn không có gì: D)
SidOfc

21

Bạn có thể chạy vim -V, dẫn đầu ra thông qua một tiện ích có thêm dấu thời gian và phân tích đầu ra. Dòng lệnh này thực hiện điều này, ví dụ:

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

Bạn có thể phải gõ một cách mù quáng :qđể quay lại dấu nhắc của bạn. Sau đó, bạn sẽ tìm thấy tệp vilogtrong thư mục hiện tại của mình với dấu thời gian thuê ở đầu mỗi dòng.

Nếu bạn có thể làm với độ chi tiết của giây, bạn có thể làm điều này:

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

1
Tuyệt vời, thật là một giải pháp tuyệt vời.
Benj

3
Bạn có biết "perl -n" thực hiện trong khi (<>) {} cho bạn.
Benj

1
Bây giờ bạn đề cập đến nó: có, tôi đã làm. Tôi sẽ chỉnh sửa câu trả lời để nhận các lệnh ngắn hơn. Cảm ơn.
innaM

20

Dựa trên công việc được thực hiện bởi @hyiltiz phụ thuộc vào R, tôi đã tạo một phiên bản Python của trình lược tả, vì điều này thường có sẵn trên một hệ thống mà R.

Nó cũng dễ dàng hơn một chút để mở rộng, do đó, các tính năng là:

  • Tự động phát hiện thư mục plugin,
  • Thanh cốt truyện nhờ matplotlib,
  • Chạy phân tích qua một số lần thực hiện để có độ lệch trung bình / tiêu chuẩn ,
  • Hỗ trợ cả vimneovim ,
  • Có thể được sử dụng với lệnh vim đầy đủ để kiểm tra các tính năng tải nhanh, mở tệp với một kiểu tệp cụ thể, v.v.
  • Xuất kết quả sang tệp csv.

Đầu ra tương tự như những gì vim-plugins-profile cung cấp:

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

hồ sơ vim


Plugin này không hoạt động cho các cửa sổ neovim. Thông báo lỗi là No plugin found.
jdhao

16

Tôi đã tinh chỉnh giải pháp vim -V bằng innaM để hiển thị thời gian delta:

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

1
Ngọt! Tôi lấy tự do để rút ngắn điều này một chút và làm cho nó trở nên "Hoàn thiện" hơn.
innaM

5

Nếu bạn đang tải các plugin của mình từ tệp .vimrc, điều bạn có thể làm là đặt một phần qtrên một số dòng thông qua tệp để thoát nó để bạn có thể sử dụng bộ đếm thời gian, như timelệnh unix . Cẩn thận hơn, điều này sẽ giống như:

  1. sao lưu .vimrctập tin hiện có
  2. nhận xét tất cả trừ một số bổ sung được chọn
  3. chèn một qdòng
  4. gọi time vim lặp lại và trung bình
  5. khôi phục lại bản sao lưu

Điều này không thanh lịch nhưng tôi nghĩ nó sẽ hoàn thành công việc.


Hmm, không tệ trong một nhúm. Tôi đã chia vimrc của mình thành nhiều tệp riêng biệt nên không quá khó để tự động hóa.
Benj


1

Có thể thuận tiện để theo dõi --startimekhi mở một tệp cụ thể

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

0

Không có timelệnh bash có thể được sử dụng như vậy:

time vim

EDIT : Không bao gồm các kịch bản bắt đầu thời gian. Sử dụng đề xuất @jamessan thay thế.


Vâng, có nhưng điều đó sẽ chỉ cho bạn biết vim mất bao lâu để mở và đóng, chứ không phải mất bao lâu để phân tích từng kịch bản.
Benj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.