ডেটটাইম.এখন কোনও কার্য সম্পাদন কার্যকারিতা পরিমাপের সেরা উপায়?


474

আমার একটি বাধা খুঁজে পাওয়া দরকার এবং যথাসম্ভব যথাযথ পরিমাপের সময় হিসাবে সঠিকভাবে প্রয়োজন।

নিম্নলিখিত কোড স্নিপেট কি কর্মক্ষমতা পরিমাপ করার সেরা উপায়?

DateTime startTime = DateTime.Now;

// Some execution process

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);

যাইহোক, আপনি যদি কিছু খুঁজছেন না তবে দ্রুত এবং নোংরা পারফরম্যান্স কাউন্টার ব্যবহার করা যেতে পারে।
জোনাথন সি ডিকিনসন

1
আপনার আরও বৃহত্তর নির্ভুলতার প্রয়োজন হলে স্টপওয়াচ.গেটটাইমস্ট্যাম্প ব্যবহার করুন, অন্যথায় উত্তরটি ভাল।
dbasnett

@ dbasnett আপনি কি উত্তরটিতে আরও বিশদে যেতে পারেন?
ডেভিড বাসরব

উপরের উদাহরণে দীর্ঘ থেকে শুরু এবং শেষের সময় পরিবর্তন করুন এবং ডেটটাইম.নউয়ের পরিবর্তে তাদের কাছে স্টপওয়াচ.গেটটাইমস্ট্যাম্প বরাদ্দ করুন। সময় নেওয়া হয় (শেষ-শুরু) / স্টপওয়াচ। ফ্রিকোয়েন্সি।
dbasnett

উত্তর:


649

না এইটা না. স্টপওয়াচ (ইন System.Diagnostics) ব্যবহার করুন

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

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

স্টপওয়াচ স্বয়ংক্রিয়ভাবে উচ্চ-নির্ভুলতা টাইমারগুলির অস্তিত্বের জন্য পরীক্ষা করে।

এটি উল্লেখ করার মতো যে, সময় অঞ্চল, ডিএসটি এবং এর মতো কাজগুলির কারণে DateTime.Nowপ্রায়শই বেশ কিছুটা ধীর হয় ।DateTime.UtcNow

ডেটটাইম.উটকনোর সাধারণত 15 মাইল রেজোলিউশন থাকে। একটি দুর্দান্ত সারাংশের নির্ভুলতা সম্পর্কে জন চ্যাপম্যানের ব্লগ পোস্টটি দেখুন SeeDateTime.Now

আকর্ষণীয় ট্রিভিয়া: DateTime.UtcNowআপনার হার্ডওয়্যার যদি উচ্চ ফ্রিকোয়েন্সি কাউন্টারকে সমর্থন না করে তবে স্টপওয়াচটি আবার ফিরে আসে। স্টাটওয়াচ স্ট্যাটিক ফিল্ড স্টপওয়াচ দেখে উচ্চ নির্ভুলতা অর্জনের জন্য হার্ডওয়্যার ব্যবহার করে কিনা তা পরীক্ষা করে দেখতে পারেন sসই হাইগ্রাইসোলিউশন


3
আমি একটি পারফর্ম ওয়ার্ক () রাখি; "গরম করার জন্য" স্টপওয়াচের আগে।
দিভান

2
এছাড়াও আপনার সুপারিশটি যুক্ত করতে হবে যে আপনি যদি PerformWork()খুব সংক্ষিপ্ত হয়ে থাকেন তবে আপনি বারবার কল করতে পারবেন এবং কলগুলির ব্যাচের গড় গণনা করতে পারবেন। এছাড়াও, Stopwatchকোনও স্ট্রোব-প্রভাব এড়ানোর জন্য আপনার শুরু / থামানোর পরিবর্তে কলগুলির পুরো ব্যাচটি টাইম করুন যা আপনার সময়ের পরিমাপকে জঞ্জাল করে তুলবে।
ডেভিজেজার

1
স্টপওয়াচ মাল্টিকোরের থ্রেডসেফ নয়। দেখুন stackoverflow.com/questions/6664538/... এবং stackoverflow.com/questions/1149485/...
পাভেল Savara

1
sw.ElapsedMilliseconds; এছাড়াও করতে পারেন
ফ্ল্যাপি

2
@Pavel, পরিষ্কার করা, স্টপওয়াচ Microsoft দ্বারা উইন্ডোজ 7 এবং উইন্ডোজ 8 দৌড়াচ্ছে যে আধুনিক মাল্টিকোর প্রসেসর উপর সবচেয়ে ভালো সমাধান (কম ওভারহেড এবং উচ্চ নির্ভুলতা) হিসাবে বাঞ্ছনীয় msdn.microsoft.com/en-us/library/windows/ ডেস্কটপ /…
রন

91

আপনি যদি দ্রুত এবং নোংরা কিছু চান তবে আমি আরও বড় ডিগ্রি নির্ভুলতার পরিবর্তে স্টপওয়াচ ব্যবহার করার পরামর্শ দেব।

Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();

Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);

পরিবর্তে আপনি যদি একটু আরো পরিশীলিত আপনি সম্ভবত যেমন 3 য় পক্ষের প্রোফাইলার ব্যবহার বিবেচনা করা উচিত প্রয়োজন বীজে পিঁপড়ে না ধরতে


56

এই নিবন্ধটি বলছে যে সবার আগে আপনাকে তিনটি বিকল্পের তুলনা করতে হবে Stopwatch, DateTime.Nowএবং DateTime.UtcNow

এটি এটিও দেখায় যে কিছু ক্ষেত্রে (যখন পারফরম্যান্স কাউন্টারটি উপস্থিত থাকে না) স্টপওয়াচটি ডেটটাইম ব্যবহার করে tউত্তিনি এখন + কিছু অতিরিক্ত প্রক্রিয়াজাতকরণ। এ কারণে এটি স্পষ্টত যে সেই ক্ষেত্রে ডেটটাইম Uউত্তনউই সেরা বিকল্প (কারণ অন্যরা এটি ব্যবহার করে + কিছু প্রক্রিয়াজাতকরণ)

তবে, যেমন দেখা যাচ্ছে, কাউন্টারটি প্রায় সর্বদা উপস্থিত থাকে - উচ্চ-রেজোলিউশনের পারফরম্যান্স কাউন্টার এবং .NET স্টপওয়াচের সাথে সম্পর্কিত এর অস্তিত্ব সম্পর্কে ব্যাখ্যা দেখুন ?

এখানে একটি পারফরম্যান্স গ্রাফ। বিকল্পগুলির তুলনায় উত্কনও কীভাবে কম কর্মক্ষমতা ব্যয় করেছে তা লক্ষ্য করুন:

এখানে চিত্র বিবরণ লিখুন

এক্স অক্ষটি হ'ল নমুনা আকারের আকার, এবং ওয়াই অক্ষটি উদাহরণের তুলনামূলক সময়।

একটি জিনিস Stopwatchভাল এটি উচ্চতর রেজোলিউশনের সময় পরিমাপ সরবরাহ করে। আরেকটি হ'ল এর আরও OO প্রকৃতি। যাইহোক, চারপাশে একটি ওও মোড়ক তৈরি UtcNowকরা কঠিন হতে পারে না।


প্রথম লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হচ্ছে।
পিটার মর্টেনসেন

1
ভাঙা হাঁ হয়ে গেছে .. টাইম মেশিনটি এটি অনুমান করতে পারে show আপনি কেন "তিনটি" সম্পাদনা করবেন তা বিটিডব্লিউ, এখানে বিশ্বাস করার দরকার নেই।
ভ্যালেন্টিন কুজুব

18

আপনার বেঞ্চমার্কিং কোডটিকে কোনও ইউটিলিটি শ্রেণি / পদ্ধতিতে ঠেলাতে দরকারী। StopWatchশ্রেণী থাকতে হবে না Disposedবা Stoppedত্রুটি সম্পর্কে। সুতরাং, সবচেয়ে সহজ কোডে সময় কিছু কর্ম হয়

public partial class With
{
    public static long Benchmark(Action action)
    {
        var stopwatch = Stopwatch.StartNew();
        action();
        stopwatch.Stop();
        return stopwatch.ElapsedMilliseconds;
    }
}

নমুনা কলিং কোড

public void Execute(Action action)
{
    var time = With.Benchmark(action);
    log.DebugFormat(“Did action in {0} ms.”, time);
}

এখানে এক্সটেনশন পদ্ধতির সংস্করণ

public static class Extensions
{
    public static long Benchmark(this Action action)
    {
        return With.Benchmark(action);
    }
}

এবং নমুনা কলিং কোড

public void Execute(Action action)
{
    var time = action.Benchmark()
    log.DebugFormat(“Did action in {0} ms.”, time);
}

1
আরও ভাল গ্রানুলারিটি সম্পর্কে কি? অনেকগুলি এক এমএসেরও কম সময়ে ঘটে।
হেনরিক

বিচ্ছিন্ন সম্পত্তিটি ফেরত দিন, এটি একটি টাইমস্প্যান। আমি আপনাকে কেবল প্যাটার্নটি দেখিয়ে দিচ্ছি। এটি বাস্তবায়নে মজা করুন।
অ্যান্টনি মাস্ট্রিয়ান

Elapsed.TotalMillisecondsউচ্চতর নির্ভুলতার জন্য ফিরে আসুন । খুব এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/8894425/...
nawfal

16

বিরাম ঘড়ি কার্যকারিতা ভালো (উচ্চতর স্পষ্টতা) হতে হবে। আমিও ঠিক জনপ্রিয় profilers এক ডাউনলোড করার কথা বলতে চাই, যদিও ( DotTrace এবং বীজে পিঁপড়ে না ধরতে বেশী আমি সবচেয়ে ব্যবহার করেছি হয় ... DotTrace বিনামূল্যে মহড়া সম্পূর্ণ ক্রিয়ামূলক এবং অন্যদের কিছু মত টাট্টু ঘোড়া না)।


13

System.Diagnostics.Shopwatch ক্লাসটি ব্যবহার করুন।

Stopwatch sw = new Stopwatch();
sw.Start();

// Do some code.

sw.Stop();

// sw.ElapsedMilliseconds = the time your "do some code" took.

11

ডিট্টো স্টপওয়াচ, এটি আরও ভাল।

কর্মক্ষমতা পরিমাপের বিষয়ে আপনার "// কিছু এক্সিকিউশন প্রক্রিয়া" খুব সংক্ষিপ্ত প্রক্রিয়া কিনা তাও পরীক্ষা করা উচিত।

এও মনে রাখবেন যে আপনার "// কিছু এক্সিকিউশন প্রক্রিয়া" এর প্রথম রান পরবর্তী রানগুলির চেয়ে ধীর হতে পারে।

আমি সাধারণত কোনও পদ্ধতিটিকে একটি লুপে 1000 বার বা 1000000 বার চালিয়ে পরীক্ষা করি এবং একবার চালানোর চেয়ে আমি আরও সঠিক ডেটা পেয়েছি।


9

সময় মাপার জন্য এগুলি দুর্দান্ত উপায়, তবে এটি কেবল বাধা (গুলি) খুঁজে পাওয়ার খুব পরোক্ষ উপায়।

থ্রেডে কোনও বাধা খুঁজে পাওয়ার সর্বাধিক প্রত্যক্ষ উপায় হ'ল এটি চালানো এবং এটি আপনার যা কিছু অপেক্ষা করতে বাধ্য করে তা করার সময় এটি বিরতি বা ব্রেক কী দিয়ে থামিয়ে দিন। এটি বেশ কয়েকবার করুন। যদি আপনার বাটেনেকটি X% সময় নেয় তবে এক্স% হ'ল সম্ভাবনা যা আপনি প্রতিটি স্ন্যাপশটের অ্যাক্টে এটি ধরবেন।

এটি কীভাবে এবং কেন কাজ করে তার আরও সম্পূর্ণ ব্যাখ্যা এখানে


7

@ শ্যান চেম্বারস

FYI, .NET টাইমার ক্লাসটি ডায়াগনস্টিক্সের জন্য নয়, এটি প্রিসেট ব্যবধানে ইভেন্টগুলি উত্পন্ন করে ( এমএসডিএন থেকে ):

System.Timers.Timer aTimer;
public static void Main()
{
    // Create a timer with a ten second interval.
    aTimer = new System.Timers.Timer(10000);

    // Hook up the Elapsed event for the timer.
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    // Set the Interval to 2 seconds (2000 milliseconds).
    aTimer.Interval = 2000;
    aTimer.Enabled = true;

    Console.WriteLine("Press the Enter key to exit the program.");
    Console.ReadLine();
}

// Specify what you want to happen when the Elapsed event is 
// raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}

সুতরাং এটি সত্যিই আপনাকে কিছুটা সময় নিয়ে যেতে সাহায্য করে না, কেবলমাত্র একটি নির্দিষ্ট সময় কেটে গেছে।

টাইমারটি সিস্টেম.স উইন্ডোস.ফোর্মে একটি নিয়ন্ত্রণ হিসাবেও প্রকাশিত হয়েছে ... আপনি এটি আপনার ডিজাইনার সরঞ্জাম বাক্সে ভিএস05 / ভিএস08-তে খুঁজে পেতে পারেন


6

এটি সঠিক উপায়:

using System;
using System.Diagnostics;

class Program
{
    public static void Main()
    {
        Stopwatch stopWatch = Stopwatch.StartNew();

            // some other code

        stopWatch.Stop();

        // this not correct to get full timer resolution
        Console.WriteLine("{0} ms", stopWatch.ElapsedMilliseconds);

        // Correct way to get accurate high precision timing
        Console.WriteLine("{0} ms", stopWatch.Elapsed.TotalMilliseconds);
    }
}

আরও তথ্যের জন্য নির্ভুল পারফরম্যান্স কাউন্টার পাওয়ার জন্য ডেটাটাইমের পরিবর্তে স্টপওয়াচ ব্যবহার করুন


6

ভিজ্যুয়াল স্টুডিও টিম সিস্টেমের এমন কিছু বৈশিষ্ট্য রয়েছে যা এই সমস্যাটিতে সহায়তা করতে পারে। মূলত আপনি ইউনিট পরীক্ষা লিখতে পারেন এবং স্ট্রেস বা লোড পরীক্ষার অংশ হিসাবে আপনার সফ্টওয়্যারটির বিরুদ্ধে চালানোর জন্য এগুলিকে বিভিন্ন পরিস্থিতিতে মিশ্রণ করতে পারেন। এটি কোডের এমন ক্ষেত্রগুলি সনাক্ত করতে সহায়তা করতে পারে যা আপনার অ্যাপ্লিকেশনগুলির কার্যকারিতা সবচেয়ে বেশি প্রভাবিত করে।

মাইক্রোসফ্টের প্যাটার্নস এবং অনুশীলন গোষ্ঠীর ভিজ্যুয়াল স্টুডিও টিম সিস্টেম পারফরম্যান্স টেস্টিং গাইডেন্সে কিছু গাইডেন্স রয়েছে



5

এটি যথেষ্ট পেশাদার নয়:

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

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

আরও নির্ভরযোগ্য সংস্করণটি হ'ল:

PerformWork();

int repeat = 1000;

Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < repeat; i++)
{
   PerformWork();
}

sw.Stop();

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

আমার আসল কোডে, আমি জিজি.কলেক্ট কলকে একটি পরিচিত অবস্থায় পরিচালিত হিপগুলি পরিবর্তন করতে যুক্ত করব এবং স্লিপ কল যুক্ত করব যাতে কোডের বিভিন্ন অন্তরগুলি সহজেই ইটিডাব্লু প্রোফাইলে পৃথক করা যায়।


4

আমি খুব সামান্য কর্মক্ষমতা পরীক্ষণ এই সাজানোর কাজ করেছি (আমি ", এই ধীর এটা আরো দ্রুত" শুধু মনে ঝোঁক) যাতে আমি প্রায় কাছাকাছি সবসময় এই সঙ্গে চলে গেছে।

পারফরম্যান্স চেক করার জন্য একটি গুগল প্রচুর সংস্থান / নিবন্ধ প্রকাশ করে।

পারফরম্যান্সের তথ্য পেতে অনেকে পিনভোক ব্যবহার করে উল্লেখ করেন। আমি যে প্রচুর উপকরণ অধ্যয়ন করি সেগুলি কেবলমাত্র আতর ব্যবহার করে উল্লেখ করা হয় ..

সম্পাদনা:

স্টপওয়াচের কথাবার্তা দেখেছেন .. দুর্দান্ত! আমি কিছু শিখেছি :)

এটি একটি ভাল নিবন্ধ মত দেখাচ্ছে


4

আমার প্রোগ্রামগুলির মধ্যে আমি যেভাবে ব্যবহার করছি তা এখানে প্রদর্শিত হিসাবে স্টপ ওয়াচ ক্লাসটি ব্যবহার করা হচ্ছে।

Stopwatch sw = new Stopwatch();
sw.Start();


// Critical lines of code

long elapsedMs = sw.Elapsed.TotalMilliseconds;

1
না একটি সুরুক. আমি অবশ্যই ভুল করে এটি যুক্ত করেছিলাম। আমি এখন বিষয়টি পুনরায় তৈরি করেছি re এটা ইশারা জন্য ধন্যবাদ।
ব্ল্যাকভোল্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.