प्रोफाइल स्टार्टअप समय प्रोफाइलिंग


139

विम का उपयोग करते समय मुझे बहुत सारे प्लग-इन सक्षम किए गए हैं - मैंने वर्षों से प्लगइन्स एकत्र किए हैं। मैं थोड़ा सा तंग हूं कि विम को अब शुरू करने में कितना समय लगता है, इसलिए मैं इसके स्टार्टअप को प्रोफाइल करना चाहता हूं और देखना होगा कि मेरे पास कौन से प्लगइन्स जिम्मेदार हैं।

क्या विम के स्टार्टअप या स्क्रिप्ट-रन को प्रोफाइल करने का कोई तरीका है? आदर्श रूप से मैं जानना चाहता हूं कि विम प्रत्येक भार लिपि में कितना समय बिताता है।

जवाबों:


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"
जैमेसन

25
अगर आप चाहते हैं कि इसे सिर्फ छापा जाए, तो कोशिश करेंvim --startuptime /dev/stdout +qall
Capi Etheriel

@barraponto भी time vim +qअगर आप केवल एक पूरे के रूप में स्टार्टअप के समय करना चाहते हैं।
ब्रैडेन बेस्ट

मेरे टर्मिनल पर vim --startuptime /dev/stdout +qallऔर के बीच एक महत्वपूर्ण अंतर है vim --startuptime vim.log +qall; cat vim.log
होट्सचे

40

आप स्वयं के प्रोफाइलिंग तंत्र का उपयोग कर सकते हैं:

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

उपरोक्त चलाने के बाद, आपको वर्तमान निर्देशिका में profile.log नामक एक फाइल मिलेगी जिसमें सभी आवश्यक जानकारी होगी। पहले से मौजूद प्रति-कार्य के समान प्रति-स्क्रिप्ट सूचना तालिका प्राप्त करने के लिए, इस फ़ाइल को खोलने के बाद उपयोग करें):

" 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स्क्रिप्ट की संख्या बहुत बड़ी होने पर आप हमेशा अंतर्निहित कमांड का उपयोग कर सकते हैं ।


मुझे यह महसूस नहीं हुआ कि विम के पास एक प्रोफाइलिंग कमांड थी, जो इसे इंगित करने के लिए धन्यवाद।
बेनज

@ बेन्ज इसे निष्क्रिय किया जा सकता है। डॉक्टर के अनुसार आपको या तो सुविधाओं के विशाल सेट के साथ विम की आवश्यकता होती है या स्वयं को संकलित किया जाता है जहां आपने इस सेट को सक्षम किए बिना स्पष्ट रूप से सक्षम किया है।
ZyX

2
अगर मैं कर सकता तो यह +3 होगा। इसने मुझे एक चेक को ट्रैक करने में मदद की dbext.vim, जो तीन सेकंड से अधिक समय से चल रहा था। github.com/johnsyweb/dotfiles/commit/09c3001
Johnsyweb

@ZyX, मैं इसे विंडोज़ शेल (जीवीएम) में कैसे कर सकता हूं? यह विंडोज़ gvim में काम नहीं करता है। मैंने इस कमांड को विंडोज़ शेल में डाला है। यह gvim --cmd 'profile start profile.log' --cmd 'profile func *' --cmd 'profile file *' -c 'profdel func *' -c 'profdel file *' -c 'qa!'बहुत सारी खाली फ़ाइलों को विम में बनाता है।
रेमन

@ नींबू डबल कोट्स का उपयोग करें। या साइबरविन से बैश।
ZyX

39

आपके प्रश्न का बेहतर उत्तर देने के लिए मैंने यह गित्बम प्रोजेक्ट बनाया । मूल रूप से, यह प्रत्येक प्लग के लिए प्रत्येक फ़ंक्शन कॉल के लिए समय निर्धारित करता है, जो कच्चे विम प्रोफ़ाइल आउटपुट से स्पष्ट (लेकिन महत्वपूर्ण) नहीं है। प्रोफाइलिंग परिणाम बनाने के लिए बैश, पायथन, आर, रूबी का समर्थन किया जाता है।

आपको इस तरह एक परिणाम प्राप्त होगा:

vim- प्लगइन्स-प्रोफाइल आंकड़ा

इस तरह से टेक्स्ट आउटपुट के साथ:

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!    

कम प्रतिष्ठा के कारण मैं आंकड़े नहीं जोड़ सका। आप केवल !टैग से पहले जोड़कर आकृति में जोड़ सकते हैं ।

2
+1 यह बहुत अच्छा है ;-) मेरा सवाल 6 साल पुराना है (अब यकीन करना मुश्किल है) इसलिए मुझे उम्मीद है कि आप मेरे मुकाबले अपने फायदे के लिए ऐसा कर रहे होंगे। फिर भी, मुझे यकीन है कि यह प्रश्न के अन्य दर्शकों के लिए उपयोगी होगा, जो आश्चर्यजनक रूप से लोकप्रिय रहा है।
बेंज ओक्ट

1
@ बैंज हां, मैं प्रोफाइलिंग खुद करने की कोशिश कर रहा था, तब आपका सवाल मिला। मैं जवाबों से संतुष्ट नहीं था और बस कुछ सुधार किए। मेरा मानना ​​है कि 6 साल का रुझान थोड़ा बदल जाता है - कैंडी ग्राफ़ प्राप्त करना बहुत सुविधाजनक है!
१५ पर हाइटेलिज

बहुत अच्छा! मेरे vim को भी चेक किया,> 60 ms ^। ^ यह आपको पैकेज को जल्दी से ढूंढने में मदद कर सकता है जो आपको बहुत धीमा कर देता है (जो कि मेरे मामले में अभी भी कुछ भी नहीं है: D)
SidOfc

21

आप vim -Vएक उपयोगिता के माध्यम से आउटपुट को चला सकते हैं , जो टाइमस्टैम्प जोड़ता है और आउटपुट का विश्लेषण करता है। यह कमांड लाइन ऐसा करती है, जैसे:

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

आपको :qअपने प्रॉम्प्ट पर वापस जाने के लिए आँख बंद करके लिखना पड़ सकता है । बाद में, आपको vilogअपनी वर्तमान निर्देशिका में फ़ाइल को प्रत्येक पंक्ति की शुरुआत में hire टाइमस्टैम्प के साथ ढूंढना चाहिए ।

यदि आप एक सेकंड की ग्रैन्युलैरिटी के साथ कर सकते हैं, तो आप यह कर सकते हैं:

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

1
शानदार, क्या शानदार समाधान है।
बेन्ज

3
क्या आप जानते हैं कि "पर्ल-एन" आपके लिए (<>) {} करता है।
बेंज

1
अब जब आप इसका उल्लेख करते हैं: हाँ, मैंने किया था। मैं छोटी कमांड प्राप्त करने के लिए उत्तर को संपादित करने जा रहा हूं। धन्यवाद।
इन्नाएम

20

द्वारा किए गए कार्य के आधार पर @Hyiltiz जो R पर निर्भर करता है, मैंने प्रोफाइलर का पायथन संस्करण बनाया , क्योंकि यह अधिक बार एक सिस्टम पर उपलब्ध होता है कि आर।

यह विस्तार करना भी थोड़ा आसान है, इस प्रकार विशेषताएं हैं:

  • प्लगइन फ़ोल्डर का स्वचालित पता लगाना,
  • मैट प्लॉटलिब का बार प्लॉट
  • पाने के लिए कई निष्पादनों पर विश्लेषण चलाएं औसत / मानक विचलन ,
  • विम और नवम दोनों का समर्थन करता है ,
  • एक पूर्ण विम कमांड के साथ उपयोग किया जा सकता है आलसी-लोडिंग विशेषताओं का परीक्षण करने के लिए है, एक फ़ाइल को एक विशिष्ट फ़िलाटाइप आदि के साथ खोलना।
  • एक सीएसवी फ़ाइल के लिए निर्यात परिणाम।

आउटपुट वैम-प्लगइन्स-प्रोफ़ाइल के समान है:

$ 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-प्रोफाइलर


यह प्लगइन नियोविम विंडो के लिए काम नहीं करता है। त्रुटि संदेश है No plugin found
jdhao

16

मैंने डेल्टा समय दिखाने के लिए innaM द्वारा विम -V समाधान को परिष्कृत किया :

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

1
मिठाई! मैंने इसे थोड़ा छोटा करने के लिए स्वतंत्रता ली और इसे और अधिक "पेरिशल" बना दिया।
इन्नाएम

5

यदि आप अपने प्लगइन्स को एक .vimrc फ़ाइल से लोड कर रहे हैं, तो आप क्या कर सकते हैं qइसे फ़ाइल के माध्यम से कुछ लाइन पार्ट पर रख दिया जाए ताकि आप इसे छोड़ सकें ताकि आप एक प्रक्रिया टाइमर का उपयोग कर सकें, जैसे कि यूनिक्स timeकमांड। अधिक अच्छी तरह से, यह इस तरह दिखेगा:

  1. बैकअप मौजूदा .vimrcफ़ाइल
  2. सभी का चयन करें लेकिन प्लगइन्स की एक चयनित संख्या
  3. एक qलाइन डालें
  4. कॉल को time vimदोहराव और औसत
  5. बैकअप बहाल

यह सुरुचिपूर्ण नहीं है लेकिन मुझे लगता है कि इससे काम हो जाएगा।


हम्म, चुटकी में बुरा नहीं। मैं पहले से ही अपने vimrc अलग फ़ाइलों के बहुत सारे में विभाजित है तो स्वचालित करने के लिए बहुत मुश्किल नहीं होना चाहिए।
Benj


1

--startimeकिसी विशेष फ़ाइल को खोलते समय ट्रेस करना सुविधाजनक हो सकता है

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

0

क्या कोई बैश timeकमांड नहीं है जिसका उपयोग इस तरह किया जा सकता है:

time vim

संपादित करें : स्क्रिप्ट शुरू समय शामिल नहीं है। इसके बजाय @jamessan सुझाव का उपयोग करें।


हां, लेकिन यह है कि यह आपको केवल यह बताएगा कि दोनों स्क्रिप्ट को पार्स करने में कितना समय लगा है, न कि ओपन और क्लोज दोनों में।
बेंज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.