मापने कोड निष्पादन समय


120

मैं यह जानना चाहता हूं कि परीक्षण प्रयोजनों के लिए एक प्रक्रिया / कार्य / आदेश को पूरा करने में कितना समय लगता है।

यह वही है जो मैंने किया है, लेकिन मेरा तरीका गलत है, क्योंकि यदि सेकंड का अंतर 0 है, तो बीती हुई मिलीसेकंड को वापस नहीं किया जा सकता है:

ध्यान दें कि नींद का मान 500 एमएस है इसलिए बीता हुआ सेकंड 0 है तो यह मिलीसेकंड वापस नहीं कर सकता है।

    Dim Execution_Start As System.DateTime = System.DateTime.Now
    Threading.Thread.Sleep(500)

    Dim Execution_End As System.DateTime = System.DateTime.Now
    MsgBox(String.Format("H:{0} M:{1} S:{2} MS:{3}", _
    DateDiff(DateInterval.Hour, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Minute, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Second, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Second, Execution_Start, Execution_End) * 60))

क्या कोई मुझे ऐसा करने का बेहतर तरीका दिखा सकता है? शायद ए के साथTimeSpan ?

समाधान:

Dim Execution_Start As New Stopwatch
Execution_Start.Start()

Threading.Thread.Sleep(500)

MessageBox.Show("H:" & Execution_Start.Elapsed.Hours & vbNewLine & _
       "M:" & Execution_Start.Elapsed.Minutes & vbNewLine & _
       "S:" & Execution_Start.Elapsed.Seconds & vbNewLine & _
       "MS:" & Execution_Start.Elapsed.Milliseconds & vbNewLine, _
       "Code execution time", MessageBoxButtons.OK, MessageBoxIcon.Information)

1
आप इस सवाल पर मेरा जवाब देख सकते हैं:> stackoverflow.com/a/16130243/1507182 शुभकामनाएँ
ओबामा

1
@Soner अगर मैंने इसे C # के साथ टैग किया है क्योंकि C # कोड मेरे लिए स्वागत है।
इलेक्ट्रोस्टूडिओस


2
स्टॉपवॉच का उपयोग करने के स्पष्ट कारणों के अलावा, आपको DateTime.Nowडेलाइट सेविंग और टाइम ज़ोन मुद्दों के कारण कभी भी गणित नहीं करना चाहिए । कृपया इस बहुत विषय पर मेरी ब्लॉग पोस्ट
मैट जॉनसन-पिंट

जवाबों:


234

उपयोग करने के लिए एक बेहतर तरीका होगा स्टॉपवॉच , DateTimeमतभेदों के बजाय ।

स्टॉपवॉच क्लास - माइक्रोसॉफ्ट डॉक्स

तरीकों और गुणों का एक सेट प्रदान करता है जिसका उपयोग आप बीते हुए समय को सटीक रूप से मापने के लिए कर सकते हैं।

Stopwatch stopwatch = Stopwatch.StartNew(); //creates and start the instance of Stopwatch
//your sample code
System.Threading.Thread.Sleep(500);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);

1
@ElektroHacker, आप का स्वागत है, इसका उपयोग करने के लिए आसान है, इसके अलावा यह अधिक सटीक है तो DateTime :)
हबीब

1
कृपया देखें github.com/chai-deshpande/LogExec (एक NUGET पैकेज भी उपलब्ध है nuget.org/packages/LogExec )। यह ठीक वही चीजें करता है जो @ सोनर-गोनुल ने उल्लेख किया है - लेकिन, उपयोग अव्यवस्था मुक्त है और सभी बोहोटप्लेट कोड छुपाता है। बहुत उपयोगी है जब आप इसे बहुत बार उपयोग करना चाहते हैं। यह Common.Logging का भी उपयोग करता है ताकि आप अपने पसंदीदा लॉगिंग प्रदाता के साथ एकीकृत कर सकें।
चाईं

1
@ हाएब क्या आप मुझे यह समझने में मदद कर सकते हैं कि थ्रेड क्यों है। स्लीप (500) आवश्यक है? खिचड़ी भाषा मैं इसे लंघन नींद है, कि यह कम कुशल बना देगा?
एमडी सिफातुल इस्लाम

8
@ Md.SifatulIslam, इसमें Thread.Sleepदेरी करने के लिए नमूना कोड के रूप में उपयोग करने की आवश्यकता नहीं है , .... वास्तव में आपको Thread.Sleepअपने कोड में कहीं भी उपयोग करने से बचना चाहिए
Habib

59

Stopwatch समय बीतने के उपाय।

// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();

// Begin timing
stopwatch.Start();

Threading.Thread.Sleep(500)

// Stop timing
stopwatch.Stop();

Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);

यहाँ एक है DEMO


क्या यह कोड की प्रत्येक पंक्ति के निष्पादन के समय के लिए उपयोग किया जा सकता है? उदाहरण: बाइंडिंग सोर्सडॉटसोर्स = db.table; // कितना समय लगता है?
vaheeds

2
@ अश्वेत ज़रूर। बस Stopwatchअपनी प्रत्येक पंक्ति के शीर्ष पर इसे शुरू करें और अपनी प्रत्येक पंक्ति के बाद इसे रोकें। याद रखें, आपको Stopwatch.Resetगणना करने के लिए हर एक पंक्ति के बाद भी उपयोग करने की आवश्यकता है । अपनी लाइन के आधार पर; एक नज़र रखना ideone.com/DjR6ba
Soner

मैं इस पर एक छोटी सी चाल किया था ताकि चित्र के बाहर मिलिसकंड हो सके। इस तरह से देखें। लम्बी। टेस्ट्रिंग ()। स्प्लिट ('।') [0]
डोरुक

2
@ डोरुक हाँ, आप ऐसा कर सकते हैं या आप कस्टम टाइमपेन प्रारूप स्ट्रिंग्स का उपयोग कर सकते हैं जैसे stopwatch.Elapsed.ToString(@"d\.hh\:mm\:ss")कि मेरे लिए एक स्वच्छ तरीका है।
सोनर ग्नूएल

1
सबसे बढ़िया उत्तर। धन्यवाद!
तडेज

48

आप इस स्टॉपवॉच रैपर का उपयोग कर सकते हैं:

public class Benchmark : IDisposable 
{
    private readonly Stopwatch timer = new Stopwatch();
    private readonly string benchmarkName;

    public Benchmark(string benchmarkName)
    {
        this.benchmarkName = benchmarkName;
        timer.Start();
    }

    public void Dispose() 
    {
        timer.Stop();
        Console.WriteLine($"{benchmarkName} {timer.Elapsed}");
    }
}

उपयोग:

using (var bench = new Benchmark($"Insert {n} records:"))
{
    ... your code here
}

आउटपुट:

Insert 10 records: 00:00:00.0617594

उन्नत परिदृश्यों के लिए, आप BenchmarkDotNet या Benchmark.It या NBench का उपयोग कर सकते हैं


3
धन्यवाद, अब तक का सर्वश्रेष्ठ उत्तर
पिक्सेल

2
धन्यवाद, इस तरह के केंद्रीकृत तरीके की तलाश में था। एक्शनफिल्टर के साथ भी यही रणनीति बनाई है।

13

यदि आप स्टॉपवॉच क्लास का उपयोग करते हैं, तो आप 0. को वॉच को रीसेट करने के लिए .StartNew () विधि का उपयोग कर सकते हैं । इसलिए आपको कॉल करना होगा। (फिर) .Start () के बाद काम आ सकता है।


4

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

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

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


3

यदि आप उस समय की मात्रा की तलाश कर रहे हैं जिससे संबंधित थ्रेड ने एप्लिकेशन के अंदर रनिंग कोड खर्च किया है।
आप ProcessThread.UserProcessorTimeप्रॉपर्टी का उपयोग कर सकते हैं जिसे आप System.Diagnosticsनेमस्पेस के तहत प्राप्त कर सकते हैं ।

TimeSpan startTime= Process.GetCurrentProcess().Threads[i].UserProcessorTime; // i being your thread number, make it 0 for main
//Write your function here
TimeSpan duration = Process.GetCurrentProcess().Threads[i].UserProcessorTime.Subtract(startTime);

Console.WriteLine($"Time caluclated by CurrentProcess method: {duration.TotalSeconds}"); // This syntax works only with C# 6.0 and above

नोट: यदि आप मल्टी थ्रेड का उपयोग कर रहे हैं, तो आप प्रत्येक थ्रेड के समय की गणना व्यक्तिगत रूप से कर सकते हैं और कुल अवधि की गणना के लिए इसे जोड़ सकते हैं।


0

मैं एक vb.net संस्करण नहीं देख सकता था कि कोई स्टॉपवॉच क्लास का उपयोग कैसे कर सकता है इसलिए मैंने नीचे एक उदाहरण दिया है।

        Dim Stopwatch As New Stopwatch

        Stopwatch.Start()
                    ''// Test Code
        Stopwatch.Stop()
        Console.WriteLine(Stopwatch.Elapsed.ToString)

        Stopwatch.Restart()            
                   ''// Test Again

        Stopwatch.Stop()
        Console.WriteLine(Stopwatch.Elapsed.ToString)

मुझे उम्मीद है कि यह किसी को भी जो इस सवाल पर पहुंचे vb.net की तलाश में मदद करता है।

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