2012-12-20 13 views
16

एक विचार मेरे मैटलैब कोड में पाश का उपयोग कर से बचने के लिए कैसे के लिए सर्च कर रहे हैं, मैं one question on SE के अंतर्गत निम्नलिखित टिप्पणी नहीं मिली:Matlab प्रक्रियाओं को बेंचमार्क कैसे करें?

बयान आम तौर पर मैटलैब के बाद से सच "छोरों के लिए Matlab में धीमी गति से कर रहे हैं" अब है ... euhm , आर 2008 ए?

और

आप पाश बनाम क्या आपके पास पहले से के लिए बेंचमार्क एक करने की कोशिश की है? कभी कभी यह vectorized कोड की तुलना में तेजी है ...

तो मैं पूछना चाहूँगा, वहाँ आमतौर पर इस्तेमाल किया रास्ता मैटलैब में एक प्रक्रिया की गति का परीक्षण करने के लिए है? क्या उपयोगकर्ता कहीं और देख सकता है कि प्रक्रिया कितनी बार लेती है या एकमात्र तरीका एक दूसरे के बीच के समय की तुलना करने के लिए कई मिनट के लिए प्रक्रियाओं का विस्तार करता है?

उत्तर

22

MATLAB कोड के प्रदर्शन का परीक्षण करने के लिए सबसे अच्छा टूल स्टीव एडडिन्स 'timeit फ़ंक्शन, available here MATLAB सेंट्रल फ़ाइल एक्सचेंज से है।

  • कि JIT संकलन सुनिश्चित एक समारोह
  • में बेंचमार्क कोड लपेटकर कोड
  • को गर्म करना द्वारा किया जाता है:

    यह कई सूक्ष्म जैसे आप के लिए बेंच मार्किंग MATLAB कोड से संबंधित मुद्दों, संभालती है कोड कई बार चल रहा है और औसत


अद्यतन: रिलीज आर के रूप में 2013 बी, timeit कोर MATLAB का हिस्सा है।


अद्यतन: रिलीज R2016a के रूप में, MATLAB भी एक performance testing framework कि timeit करने के लिए एक समान तरीके से आप के लिए उपरोक्त मुद्दों संभालती भी शामिल है।

+2

+1 एक विधि के लिए जो मुझे अभी तक नहीं पता था और ऐसा लगता है कि यह अच्छी तरह से सोचा गया है। – Thilo

+1

शब्द "औसत" शब्द सबसे अच्छा भ्रामक है जब टाइमिट मध्यस्थ का उपयोग करता है, वहां भी मध्यस्थ को प्रभावित करने और चलने वाले समय की संख्या को बदलने का कोई तरीका नहीं दिखता है। क्या आप जानते हैं कि किसी भी तरह चलने वाले समय में मानक विचलन प्राप्त करना संभव है? कुछ स्तरों के तहत एसडी तक उपाय करना उपयोगी होगा। – hhh

+0

@hhh मुझे यकीन नहीं है कि उस शब्द के बारे में क्या भ्रामक है - औसत औसत है। वैसे भी - यदि आप चाहें तो 'टाइमिट' की कार्यक्षमता को संशोधित करना काफी आसान है (मैं यहां नए, अंतर्निर्मित संस्करण की बजाय फ़ाइल एक्सचेंज संस्करण का जिक्र कर रहा हूं, लेकिन मुझे उम्मीद है कि वे समान हैं)। फ़ंक्शन के आंतरिक भाग देखने के लिए बस 'संपादित समय' टाइप करें, और आप देखेंगे कि यह कई बार फ़ंक्शन का उपयोग करता है और फिर उन पर 'median' कहता है। व्यक्तिगत समय को आउटपुट करने के लिए बस 'टाइमिट' को संशोधित करें, और आप जो भी औसतन औसतन चाहें, या मानक विचलन भी ले सकते हैं। –

13

आप प्रोफाइलर का उपयोग करके यह आकलन कर सकते हैं कि आपके कार्य कितने समय और उनके भीतर कोड के ब्लॉक ले रहे हैं।

>> profile on; % Starts the profiler 
>> myfunctiontorun(); % This can be a function, script or block of code 
>> profile viewer; % Opens the viewer showing you how much time everything took 

व्यूअर अगली बार वर्तमान प्रोफ़ाइल डेटा को भी साफ़ करता है।

ध्यान रखें, प्रोफ़ाइल निष्पादन को धीमा कर देती है, लेकिन मेरा मानना ​​है कि यह सबकुछ में एक समान तरीके से ऐसा करता है।

जाहिर है कि यदि आपका कार्य बहुत तेज़ है, तो आप पाएंगे कि आपको विश्वसनीय परिणाम नहीं मिलते हैं, इसलिए यदि आप इसे कई बार चला सकते हैं या गणना को बढ़ा सकते हैं जो मामलों में सुधार करेगी।

यह वास्तव में सरल सामान आप परीक्षण कर रहे है, तो आप भी बस इसे tic और toc का उपयोग कर समय कर सकते हैं:

>> tic; % Start the timer 
>> myfunctionname(); 
>> toc; % End the timer and display elapsed time 
इसके अलावा

यदि आप कई टाइमर चाहते हैं, तो आप उन्हें चर को असाइन कर सकते हैं:

>> mytimer = tic; 
>> myfunctionname(); 
>> toc(mytimer); 

अंत में, आप प्रदर्शन के बजाय बीता हुआ समय संग्रहीत करना चाहते हैं अगर यह:

>> myresult = toc; 
+4

प्रोफाइलर निष्पादन को धीमा नहीं करता है जो आवश्यक रूप से समान है। यह जेआईटी कंपाइलर को अक्षम करता है, जो कोड के विभिन्न टुकड़ों पर बहुत अलग प्रभाव डाल सकता है। –

+1

@ सैम रॉबर्ट्स वाह, मुझे नहीं पता था कि प्रोफ़ाइल JIT को अक्षम करता है ... –

5

मुझे लगता है कि मुझे यह बताने का अधिकार है कि हम में से कई समय कोड के ब्लॉक को लपेटकर मैटलैब करते हैं, जिसमें हम tic और toc के बीच रुचि रखते हैं। इसके अलावा, हम यह सुनिश्चित करने के लिए सावधानी बरतते हैं कि कुल समय 10 सेकंड के सेकंड (सेकेंड के 1 सेकंड या सेकेंड के 100 सेकंड) के क्रम का है और इसे 3-5 बार दोहराएं और केंद्रीय प्रवृत्ति (जैसे माध्य) का कुछ उपाय लें और उस से हमारे निष्कर्ष निकालें।

यदि कोड का टुकड़ा 10 से कम कहता है, तो उसे श्रेणी में लाने के लिए जितनी बार आवश्यक हो उतनी बार दोहराएं, अगले पर एक पुनरावृत्ति के किसी भी प्रभाव से बचने के लिए सावधान रहें। और यदि कोड स्वाभाविक रूप से 100 सेकंड या उससे अधिक समय लेता है, तो या तो परीक्षण पर अधिक समय व्यतीत करें या इसे अधिक तेज़ी से चलाने के लिए कृत्रिम रूप से छोटे इनपुट डेटा के साथ आज़माएं।

मेरे अनुभव में स्वीकार्य रूप से कम भिन्नता के साथ औसत रन टाइम पर डेटा प्राप्त करने के लिए मिनटों के लिए प्रोग्राम चलाने की आवश्यकता नहीं है। यदि मैं 5 बार एक प्रोग्राम चलाता हूं और परिणामों में से एक (या दो) मतलब से बहुत अलग है तो मैं इसे फिर से चलाऊंगा।

बेशक, यदि कोड में ऐसी कोई विशेषताएं हैं जो अपना रन टाइम गैर-निर्धारिती बनाती हैं तो यह एक अलग मामला है।

संबंधित मुद्दे