2013-03-25 7 views
9

के बारे में भ्रम मैं एक निश्चित विधि के औसत निष्पादन समय को मापने के लिए PerformanceCounter सेट अप करने का प्रयास कर रहा हूं। मैंने AverageTimer32 पर पढ़ने की कोशिश की है और मैंने कई उदाहरण देखे हैं, लेकिन मुझे लगता है कि यह सही नहीं लगता है।औसत टिमर 32 प्रदर्शन काउंटर

मैं श्रेणियों

CounterCreationDataCollection CCDC = new CounterCreationDataCollection(); 

// Add the counter. 
CounterCreationData averageTimer32 = new CounterCreationData(); 
averageTimer32.CounterType = PerformanceCounterType.AverageTimer32; 
averageTimer32.CounterName = counterName; 
CCDC.Add(averageTimer32); 

// Add the base counter. 
CounterCreationData averageTimer32Base = new CounterCreationData(); 
averageTimer32Base.CounterType = PerformanceCounterType.AverageBase; 
averageTimer32Base.CounterName = baseCounterName; 
CCDC.Add(averageTimer32Base); 

// Create the category. 
PerformanceCounterCategory.Create(categoryName, "Demonstrates usage of the AverageTimer32 performance counter type", PerformanceCounterCategoryType.SingleInstance, CCDC); 

की स्थापना की तो मैं काउंटर बनाने

PC = new PerformanceCounter(categoryName, counterName, false); 

BPC = new PerformanceCounter(categoryName, baseCounterName, false); 

PC.RawValue = 0; 
BPC.RawValue = 0; 

और अंत में मैं बीता हुआ समय हर बार मेरी विधि

private void TheMethodIWantToMeasure() { 
    Stopwatch stopwatch = Stopwatch.StartNew(); 

    // Fake work that take ~50ms 
    Thread.Sleep(50 + random.Next(-10, 10)); 

    stopwatch.Stop(); 

    PC.IncrementBy(stopwatch.ElapsedTicks); 
    BPC.Increment(); 
} 

की तरह कर कहा जाता है के लिए लॉग इन यह, मैं इस तरह दिखने प्रदर्शन प्रदर्शन मॉनीटर के परिणामस्वरूप समाप्त होता है। मुझे 50 एमएस के आसपास एक संक्रामक वक्र के बजाय स्पाइक्स मिलते हैं: Picture

क्या मैंने AverageTimer32 गलत समझा है? मैंने इसके बारे में पढ़ा है, लेकिन यह थोड़ा उलझन में है। हालांकि, मैंने उदाहरणों को व्यावहारिक रूप से मेरे जैसा ही किया है, इसलिए मुझे लगता है कि इसे काम करना चाहिए। क्या कारण हो सकता है कि मुझे केवल स्पाइक मिलते हैं?

संपादित यह उल्लेख है कि TheMethodIWantToMeasure केवल हर ~ 5s कहा जाता है के लायक हो सकता है, और मैं बस एहसास हुआ कि मैं कील हर ~ 5 सेकंड मिलता है। लेकिन मुझे समझ में नहीं आता कि AverageTimer32 फॉर्मूला ((एन 1-एन 0)/एफ)/(बी 1-बी 0) का उपयोग करता है तो यह परिणाम कैसे प्रभावित कर सकता है। यह इस बात पर निर्भर नहीं होना चाहिए कि मैं कितनी बार एन और बी के मूल्यों को स्टोर करता हूं?

उत्तर

1

आपका उत्तर आपकी अनुमति सेटिंग्स की ताज़ा/नमूना दर में निहित है। यदि आप अपना ~ 5s अंतराल लेना चाहते थे या कम से कम इसे ~ 10ms पर बदलना चाहते थे, तो संभवत: आप ग्राफ को नोटिस करेंगे जैसे कि आप शुरू में अपेक्षाकृत थोड़ा अधिक दिख रहे थे। वैकल्पिक रूप से अपने प्रदर्शन काउंटर रीफ्रेश दर को उच्च अंतराल (30 सेकंड) में अपडेट करें वही होगा। (perfMon ग्राफ पर राइट क्लिक करके ऐसा करें -> गुण -> सामान्य टैब -> नमूना प्रत्येक एक्स सेकंड)।

कारण यह है कि perfMon प्रत्येक 1 सेकंड (डिफ़ॉल्ट रूप से) को रीफ्रेश करता है और फिर अपना औसत प्रदर्शित करने की आवश्यकता होती है। तो यह उस संदेश के लिए आपके काउंटर में जोड़े गए ऑपरेशन को "सभी" लेता है और इसे ग्राफ़ पर प्लॉट करता है।

उदाहरण: आप संचालन एक सेकंड में क्रियान्वित (0.1ms, 0.2ms & 0.3, एमएस) था, तो परफ़ॉर्मेंस आपके औसत प्रदर्शित 0.2ms, जो सही है होना करने के लिए होगा।

अंतराल क्यों? मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि अब आपके औसत की गणना के बाद और आप अपना दूसरा "स्पाइक" देखते हैं, अगली दूसरी (जब परफमन फिर से रीफ्रेश हो जाती है), यह 0secs = 0.

मेरा सुझाव (यदि आप वास्तव में यह देखना चाहते हैं कि TheMethodIWantToMeasure औसत पर कितना समय लगता है, अपने ~ 5s अंतराल को पूरी तरह से पर ले जाएं और बस विधि को लगातार चलने दें। यह चाल चलनी चाहिए।

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