কোড প্রয়োগের সময় পরিমাপ করছে


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
আপনি এই প্রশ্নের আমার উত্তর দেখতে পারেন:> স্ট্যাকওভারফ্লো.com/a/16130243/1507182 সৌভাগ্য
ওবামা

1
@ সোনার যদি আমি এটি সি # দিয়ে ট্যাগ করি কারণ সি # কোডটি আমার জন্য স্বাগত।
এলেক্ট্রো স্টুডিওগুলি 16


2
স্টপওয়াচ ব্যবহারের সুস্পষ্ট কারণগুলি ছাড়াও, DateTime.Nowডাইটলাইট সেভিংস এবং টাইম জোনের সমস্যার কারণে আপনার কখনই কোনও গণিত করা উচিত নয় । দয়া করে এই
বিষয়টিতে

উত্তর:


233

পার্থক্যের পরিবর্তে স্টপওয়াচ ব্যবহার করা আরও ভাল উপায় 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, আপনি স্বাগত, তার সহজেই ব্যবহারযোগ্য, তাছাড়াও এটি আরো সঠিক তারপর তারিখসময় হয় :)
হাবিব

1
দয়া করে github.com/chai-deshpande/LogExec দেখুন (একটি NUGET প্যাকেজ nuget.org/packages/LogExec উপলব্ধ )। এটি ঠিক একই জিনিসগুলি ব্যবহার করে যা @ সোনার-গনুল উল্লেখ করেছেন - তবে, ব্যবহারটি বিশৃঙ্খলা মুক্ত এবং সমস্ত বয়লারপ্লেট কোড গোপন করে। আপনি যখন খুব ঘন ঘন এটি ব্যবহার করতে চান তখন খুব সহায়ক। এটি সাধারণ.লগিং ব্যবহার করে যাতে আপনার পছন্দের লগিং সরবরাহকারীর সাথে সংহত করতে পারেন।
চই

1
@ হাবিব আপনি দয়া করে আমাকে বুঝতে সাহায্য করতে পারেন যে থ্রেড.স্লিপ (500) কেন প্রয়োজনীয়? আমি ঘুম এড়িয়ে যাচ্ছি না, এটি কি কম দক্ষ করে তুলবে?
মোঃ সিফাতুল ইসলাম

8
@ মোঃ সিফাতুল ইসলাম, Thread.Sleepএটি ব্যবহার করার দরকার নেই , এটি কেবল দেরি দেখানোর জন্য একটি নমুনা কোড হিসাবে রয়েছে .... বাস্তবে Thread.Sleepআপনার কোডের যে কোনও জায়গায় ব্যবহার করা এড়ানো উচিত
হাবিব

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গণনার জন্য আপনাকে প্রতিটি একক লাইনের পরেও ব্যবহার করতে হবে। আপনার লাইনের উপর ভিত্তি করে; এক নজরে
সোনার

মিলিসেকেন্ডগুলি চিত্র থেকে সরিয়ে আনতে আমি এটিতে একটু কৌশল করেছি। এই ভাবে দেখুন laআলাপযুক্ত.টোলস্ট্রিং ()। বিভক্ত ('।') [0]
ডোরুক

2
@Doruk হ্যাঁ, আপনি তা করতে পারে অথবা আপনি ব্যবহার করতে পারেন কাস্টম Timespan বিন্যাস স্ট্রিংস মত 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

উন্নত পরিস্থিতিগুলির জন্য, আপনি বেনমার্কডটনেট বা বেঞ্চমার্ক.আইটি বা এনবেঞ্চ ব্যবহার করতে পারেন


3
ধন্যবাদ, এখনও অবধি সেরা উত্তর
পিক্সেল

2
ধন্যবাদ, কেন্দ্রীয়ভাবে এই জাতীয় সন্ধান করছিল for অ্যাকশন ফিল্টার দিয়েও এই কৌশলটি করেছেন।
ಅನಿಲ್

13

আপনি স্টপওয়াচ বর্গ ব্যবহার করেন, তাহলে আপনি ব্যবহার করতে পারেন .StartNew () পদ্ধতি সুতরাং আপনি কল করতে হবে না 0 থেকে ঘড়ি রিসেট করতে .Reset () দ্বারা অনুসরণ .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 এ সময় নির্বাহের পরিমাপের জন্য ডেটটাইমগুলি ব্যবহার করবেন না।


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

কেউ কীভাবে স্টপওয়াচ ক্লাস ব্যবহার করতে পারে তার কোনও ভিবি.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 অনুসন্ধানে সহায়তা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.