एक विधि के निष्पादन समय की गणना करें


533

संभव डुप्लिकेट:
मैं कैसे मापता हूं कि कोई फ़ंक्शन कितने समय से चल रहा है?

मेरे पास एक I / O समय लेने वाली विधि है जो किसी स्थान से दूसरे डेटा को कॉपी करती है। निष्पादन समय की गणना का सबसे अच्छा और सबसे वास्तविक तरीका क्या है? Thread? Timer? Stopwatch? कोई और उपाय? मैं सबसे सटीक एक चाहता हूं, और यथासंभव संक्षिप्त।

जवाबों:


1128

Stopwatch इस उद्देश्य के लिए डिज़ाइन किया गया है और .NET में समय निष्पादन को मापने के सर्वोत्तम तरीकों में से एक है।

var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

.NET में समय निष्पादन को मापने के लिए DateTime का उपयोग करें


अपडेट करें:

जैसा कि टिप्पणी अनुभाग में @ series0ne द्वारा बताया गया है: यदि आप कुछ कोड के निष्पादन का वास्तविक सटीक माप चाहते हैं, तो आपको प्रदर्शन काउंटर का उपयोग करना होगा जो ऑपरेटिंग सिस्टम में बनाया गया है। निम्नलिखित जवाब एक अच्छा सिंहावलोकन शामिल हैं।


2
बिल्कुल सही, और इस मामले के बारे में क्या: मेरे पास एक फ़ॉरच लूप है जो ThreadPool.QueueUserWorkItem(delegate { CopyFiles(folder, dest); }); अंदर है, लेकिन सब कुछ होने से पहले स्टॉपवॉच बंद हो जाता है।
महदी तहसीलदार

13
@DarinDimitrov - स्टॉपवॉच पूरी तरह से सही नहीं है? याद रखें कि .NET बैकग्राउंड शोर (जैसे JITing) अलग-अलग निष्पादन समय होने का कारण बनता है। इसलिए, वास्तविक रूप से, सटीक माप के लिए, ओपी को एक प्रदर्शन प्रोफाइलर का उपयोग करना चाहिए।
मैथ्यू लैटन

3
@ series0ne, बहुत अच्छी बात। आपकी बहुमूल्य टिप्पणी को शामिल करने के लिए मैं अपने उत्तर को अपडेट करूंगा।
डारिन दिमित्रोव

7
@DarinDimitrov, मैंने हाल ही में एक बहुत ही कुशल वरिष्ठ डेवलपर के साथ एक साक्षात्कार किया था। उन्होंने मुझे बताया कि डेटटाइम्स का उपयोग वास्तव में स्टॉपवॉच का उपयोग करने से अधिक सटीक है। उन्होंने कहा कि इसका कारण यह है कि .NET में स्टॉपवॉच सीपीयू के संबंध को ध्यान में नहीं रखता है, और इसलिए, यदि आपका थ्रेड एक कोर से दूसरे में जाता है, तो स्टॉपवॉच अन्य कोर के दौरान निष्पादन समय को ध्यान में नहीं रखता है; केवल एक जहां धागा निष्पादन शुरू किया। इस पर आपकी क्या राय है?
मैथ्यू लेटन

2
@ Series0ne, वरिष्ठ डेवलपर ने आपको स्टॉपवॉच और डेटटाइम के बारे में जो बताया वह बिल्कुल सच है। सिवाय इसके कि डेटटाइम के साथ आपके पास पर्याप्त सटीकता नहीं है। समस्या यह है कि .NET में ऐसा कोई वर्ग नहीं है जो आपको उन सभी सुविधाओं की अनुमति देगा।
डारिन दिमित्रोव

75

व्यक्तिगत अनुभव से, System.Diagnostics.Stopwatchकक्षा का उपयोग किसी विधि के निष्पादन समय को मापने के लिए किया जा सकता है, हालाँकि, BEWARE : यह पूरी तरह से सही नहीं है!

निम्नलिखित उदाहरण पर विचार करें:

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

उदाहरण के परिणाम

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

अब तुम सोच रहे हो; "अच्छी तरह से पहली बार 132ms क्यों लिया, और बाकी समय में काफी कम है?"

इसका उत्तर यह है कि Stopwatch.NET में "पृष्ठभूमि शोर" गतिविधि के लिए क्षतिपूर्ति नहीं करता है, जैसे कि JITing। इसलिए पहली बार जब आप अपना तरीका चलाते हैं, तो .NET JIT पहले। ऐसा करने में लगने वाले समय को निष्पादन के समय में जोड़ा जाता है। समान रूप से, अन्य कारक भी निष्पादन के समय को भिन्न करेंगे।

क्या आप वास्तव में पूर्ण सटीकता की तलाश में होना चाहिए प्रदर्शन प्रोफाइलिंग है !

निम्नलिखित पर एक नज़र डालें:

RedGate ANTS प्रदर्शन Profiler एक वाणिज्यिक उत्पाद है, लेकिन बहुत सटीक परिणाम पैदा करता है। - .NET प्रोफाइलिंग के साथ अपने अनुप्रयोगों के प्रदर्शन को बढ़ावा दें

यहाँ प्रोफाइलिंग पर एक StackOverflow लेख है: - कुछ अच्छे .NET प्रोफाइलर क्या हैं?

मैंने स्टॉपवॉच का उपयोग करके प्रदर्शन प्रोफ़ाइल पर एक लेख भी लिखा है जिसे आप .NET में प्रदर्शन प्रोफाइलिंग के रूप में देखना चाहते हैं


2
@mahditahsildari कोई समस्या नहीं। मैं खुशी से मदद कर सकता है! :-)
मैथ्यू लेटन

41
मुझे यकीन नहीं है कि यह अशुद्धि का उदाहरण क्यों है । स्टॉपवॉच पहले कॉल की कुल लागत को सही ढंग से माप रहा है, जो निश्चित रूप से उस ग्राहक के लिए प्रासंगिक है जो इस कोड को चलाने जा रहा है। वे परवाह नहीं करते हैं कि क्या उन 132 मिलीसेकंड को विधि निष्पादन या घबराने के लिए चार्ज किया जाता है, वे कुल समय बीत जाने के बारे में परवाह करते हैं।
एरिक लिपर्ट

2
@ series0ne यदि आप लूप के प्रदर्शन की परवाह करते हैं, तो एक लूप के प्रदर्शन को मापें। बस यह मत मानो कि कुछ n बार करने का अर्थ यह है कि यह एक बार निष्पादित होने के रूप में n गुना धीमा होगा।
svick

3
सबसे पहले, कोड के नमूने को बढ़ती संख्या के साथ आउटपुट का उत्पादन करना चाहिए क्योंकि स्टॉपवॉच लूप में कभी भी रीसेट नहीं होता है। और "चाहिए" से मेरा मतलब है कि यह करता है (मैंने जाँच की)। इसलिए आपका आउटपुट कोड से मेल नहीं खाता है। दूसरा, जब मैंने लूप में स्टॉप / राइट / रीसेट / स्टार्ट करने के लिए कोड को सही किया, तो पहला माप बाकी के समान था। मेरा अनुमान है कि आपका DoSomething पहली बार चलने वाले समय के लिए कुछ करता है। JIT इसका कारण हो सकता है या नहीं भी हो सकता है, लेकिन ऐसा नहीं है कि स्टॉपवॉच माप को प्रभावित कर रहा है। इसलिए -1।
ILIA BROUDNO

2
ILIA BROUDNO बिल्कुल सही है, मुझे वही परिणाम मिले। @ series0ne, आपके पास एक कंसोल है। लूप के अंदर एक लाइट, एमएस को अब तक लिखते हुए; क्योंकि आप केवल लूप समाप्त होने के बाद ही घड़ी को बंद करते हैं, यह समय के साथ प्रत्येक पुनरावृत्ति के साथ बढ़ रहा है, इसलिए हमें 3, 6, 10, 12, 15 ... जैसे कुछ देखना चाहिए, क्योंकि समय निष्पादन पर जमा होता है।
रुई मिगुएल पिनहेइरो

29

StopWatch वर्ग आपके सबसे अच्छे समाधान के लिए देखता है।

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

इसके अलावा यह एक स्थिर क्षेत्र कहा जाता है Stopwatch.IsHighResolution। बेशक, यह एक हार्डवेयर और ऑपरेटिंग सिस्टम मुद्दा है।

इंगित करता है कि टाइमर एक उच्च-रिज़ॉल्यूशन प्रदर्शन काउंटर पर आधारित है या नहीं।


18

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

अन्यथा, System.Diagnostics.StopWatch एक उच्च रिज़ॉल्यूशन टाइमर प्रदान करता है।


बिलकुल सही! मैं थोड़ा निराश हूं कि यहां पर कई लोगों ने स्टॉपवॉच का उपयोग करने का सुझाव दिया है, क्योंकि यह पूरी तरह से सही नहीं है। हालाँकि जैसा कि आपने एक प्रदर्शन प्रोफाइलर का उपयोग करने का सुझाव दिया है, यह करने का सही तरीका है! +1
मैथ्यू लेटन

7

स्टॉपवॉच उच्च-रिज़ॉल्यूशन काउंटर का उपयोग करेगा

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

यदि आप IO माप रहे हैं, तो संभवतः आपके आंकड़े बाहरी घटनाओं से प्रभावित होंगे, और मुझे बहुत चिंता होगी। सटीकता (जैसा आपने ऊपर बताया है)। इसके बजाय मैं माप की एक सीमा लेता हूं और उन आंकड़ों के माध्य और वितरण पर विचार करता हूं।


0
 using System.Diagnostics;
 class Program
 {
    static void Test1()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine("Test1 " + i);
        }
    }
  static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test1();
        sw.Stop();
        Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
   }
 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.