2008-09-28 11 views
6

मुझे विंडोज़ में .NET प्रोग्राम (सी #) पर कुछ प्रदर्शन बेंचमार्क करने की ज़रूरत है, लेकिन मैंने विंडोज़ दुनिया में ज्यादा बेंचमार्किंग नहीं की है। मैंने इसके लिए कस्टम काउंटर के साथ विंडोज 2000/एक्सपी प्रदर्शन मॉनीटर का उपयोग करने में देखा है, लेकिन मुझे नहीं लगता कि यह वही है जो मैं चाहता हूं।विंडोज़ में बेंचमार्क प्रोग्राम का सबसे अच्छा तरीका क्या है?

क्या Windows XP में इसके लिए कोई अच्छी प्रणाली सुविधाएं हैं, या मुझे केवल सिस्टम का उपयोग करने की आवश्यकता है। डायग्नोस्टिक्स। स्टॉपवॉच [संपादित करें] और मैन्युअल व्याख्या के लिए टेक्स्ट लॉग लिखें, या क्या कुछ और है?

संपादित करें: System.Diagnostics.Stopwatch से परे कुछ भी है?

+0

ताकि अन्य लोगों को, अतिरिक्त जवाब से फायदा हो सकता मुझे लगता है कि इसके लिए बेहतर होगा आप सवाल फिर से खोलने के लिए। –

+0

एग्घ, समांतरता में एक और सबक गलत हो गया ... –

+0

@ माइकल रतनपंथा: विस्तृत करने की देखभाल? –

उत्तर

5

माइक्रो-बेंचमार्किंग के लिए मुझे वास्तव में MeasureIt पसंद है (http://msdn.microsoft.com/en-us/magazine/cc500596.aspx से डाउनलोड किया जा सकता है)। यह वेंस मॉरिसन द्वारा सीएलआर पर एक प्रदर्शन वास्तुकार द्वारा लिखित एक परीक्षण परियोजना है। वर्तमान में इसमें कई नेट/सीएलआर कोर विधियों के लिए मानक का एक अच्छा सेट है। इसका सबसे अच्छा हिस्सा यह है कि आप जो कुछ भी परीक्षण करना चाहते हैं उसके लिए नए मानक को ट्विक करना और जोड़ना मुश्किल है। बस "माप/संपादित करें" चलाएं और यह स्वयं के लिए प्रोजेक्ट के साथ वीएस लॉन्च करेगा ताकि आप देख सकें कि ये बेंचमार्क कैसे लिखे गए हैं और यदि आप चाहें तो समान रूप से नए जोड़ें।

जैसा कि पहले से ही कहा गया है कि स्टॉपवॉच शायद ऐसा करने का सबसे आसान तरीका है और MeasureIt इसके समय के लिए स्टॉपवॉच का उपयोग करता है लेकिन यह कुछ अन्य चीजें भी करता है जैसे कि कोड X के ब्लॉक को चलाने और फिर आपको रनों के लिए आंकड़े प्रदान करना और क्या नहीं।

8
using System.Diagnostics; 
.... 

Stopwatch sw = new Stopwatch(); 

sw.Start(); 

// Code you want to time... 

// Note: for averaged accuracy (without other OS effects), 
//  run timed code multiple times in a loop 
//  and then divide by the number of runs. 

sw.Stop(); 

Console.WriteLine("Took " + sw.ElapsedTicks + " Ticks"); 
+0

आपको औसत परिणामों से पहले रन को अलग करना चाहिए क्योंकि यह जेआईटी संकलन प्रक्रिया के कारण अत्यधिक खराब हो सकता है। –

+0

एड। एस: अच्छा बिंदु, लेकिन जरूरी नहीं। यदि कोड वास्तविकता में केवल एक बार चलता है, तो जेआईटी समय को शायद –

+1

में फिक्स्ड करने की आवश्यकता है। निश्चित रूप से, मेरा मतलब यह नहीं है कि उस जानकारी को पूरी तरह से अवहेलना करें, बस इसे अलग करना सुनिश्चित करें ताकि यह बढ़ावा न सके औसत ऊपर जब तक परीक्षण करने वाला व्यक्ति इस तथ्य से अवगत है, तो यह ठीक होना चाहिए। मैं एक एक्सएमएल पार्सिंग दिनचर्या में बदलाव कर रहा था जिसे डेटा के कुछ बहुत बड़े हिस्सों (मेरे ऐप में सामान्य रूप से सामान्य के सापेक्ष) के बारे में बताया जा सकता है और पहले पास ~ 931ms लिया गया, जबकि सभी बाद की कॉलों ने ~ 9 1 एमएमएस लिया। –

3

यह आप क्या चाहते हैं नहीं हो सकता है, लेकिन dotTrace कई उपयोगी निदान प्रदान करता है और दृश्य स्टूडियो में एकीकृत है।

4

वहां बहुत सारे प्रोफाइलर हैं। यहाँ लोगों में से कुछ मैं के बारे में पता कर रहे हैं:

आप System.Diagnostics.Stopwatch उपयोग करने के साथ पर जाने के हैं, तो आप साधन में सक्षम हो जाएगा और अपने कोड के केवल विशेष बिंदुओं को मापें, जहां आपने स्पष्ट रूप से स्टार्ट/स्टॉप को चारों ओर रखा है। यह विशिष्ट टुकड़ों को मापने के लिए काफी अच्छा है, जैसे तंग लूप या उस तरह की चीजें, लेकिन यह आपको एक पूर्ण तस्वीर नहीं दे रहा है कि आपका प्रोग्राम कहां से अधिकतर समय बिताता है।

4

यदि आप कुछ त्वरित संख्या चाहते हैं, तो आप पावरहेल का उपयोग समग्र निष्पादन के समय कर सकते हैं। माप-आदेश cmdlet का प्रयोग करें। यह लगभग यूनिक्स में "समय" के बराबर है।

> measure-command { your.exe arg1 } 

Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 4 
Milliseconds  : 996 
Ticks    : 49963029 
TotalDays   : 5.78275798611111E-05 
TotalHours  : 0.00138786191666667 
TotalMinutes  : 0.083271715 
TotalSeconds  : 4.9963029 
TotalMilliseconds : 4996.3029 
1

अपनी परियोजना काफी बड़ा है और कॉल की बड़ी संख्या आप कर सकते हैं कर मॉड्यूल के बहुत सारे हैं, तो आपके: http://www.moduleanalyzer.com/