একটি পদ্ধতির কার্যকরকরণের সময় গণনা করুন


533

সম্ভাব্য সদৃশ:
একটি ফাংশন কতক্ষণ চলছে তা আমি কীভাবে পরিমাপ করব?

আমার কাছে আই / ও সময় গ্রহণের পদ্ধতি রয়েছে যা কোনও অবস্থান থেকে অন্য স্থানে ডেটা অনুলিপি করে। মৃত্যুদন্ড কার্যকর করার সময় গণনার সর্বোত্তম এবং আসল উপায় কোনটি? Thread? Timer? Stopwatch? অন্য কোন সমাধান? আমি সবচেয়ে সঠিক একটি চাই এবং যতটা সম্ভব সংক্ষিপ্তভাবে চাই।

উত্তর:


1128

Stopwatch এই উদ্দেশ্যে ডিজাইন করা হয়েছে এবং। নেট এ সময় নির্বাহের পরিমাপের সেরা উপায়গুলির মধ্যে একটি।

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

.NET এ সময় নির্বাহের পরিমাপের জন্য ডেটটাইম ব্যবহার করবেন না


হালনাগাদ:

মতামত বিভাগে @ সিরিজ0ne দ্বারা নির্দেশিত হিসাবে: আপনি যদি কিছু কোড প্রয়োগের সত্যিকারের যথাযথ পরিমাপ চান তবে আপনাকে অপারেটিং সিস্টেমের মধ্যে নির্মিত পারফরম্যান্স কাউন্টারগুলি ব্যবহার করতে হবে। নিম্নলিখিত উত্তর একটা চমৎকার ওভারভিউ ধারণ করে।


2
হুবহু এবং এই কেসের বিষয়ে: আমার একটি ফোরচ লুপ রয়েছে যার একটি ThreadPool.QueueUserWorkItem(delegate { CopyFiles(folder, dest); }); অভ্যন্তর রয়েছে তবে স্টপওয়াচ সবকিছু শেষ হওয়ার আগেই বন্ধ হয়ে যায়।
মাহদি তাহসিলদারি

13
@ ডারিনডিমিট্রভ - স্টপওয়াচ সম্পূর্ণ সঠিক নয়? মনে রাখবেন। নেট ব্যাকগ্রাউন্ড শোর (যেমন জেআইটিটিং) বিভিন্ন মৃত্যুদণ্ড কার্যকর হওয়ার সময় ঘটায়। অতএব, বাস্তবসম্মতভাবে, সঠিক পরিমাপের জন্য, ওপিতে একটি পারফরম্যান্স প্রোফাইলার ব্যবহার করা উচিত।
ম্যাথু লেটন

3
@ সিরিজ0ne, খুব ভাল পয়েন্ট। আমি আপনার মূল্যবান মন্তব্য অন্তর্ভুক্ত আমার উত্তর আপডেট করব।
দারিন দিমিত্রভ

7
@ ডারিনডিমিট্রভ, সম্প্রতি আমি খুব দক্ষ সিনিয়র বিকাশকারীর সাথে একটি সাক্ষাত্কার নিয়েছি। তিনি আমাকে উল্লেখ করেছিলেন যে ডেটটাইমস ব্যবহার করা স্টপওয়াচ ব্যবহারের চেয়ে আসলে আরও সঠিক। তিনি বলেছিলেন যে এর কারণ হ'ল .NET- এ স্টপওয়াচ সিপিইউ সম্পর্কিত মনোভাব বিবেচনা করে না, এবং সুতরাং, আপনার থ্রেডটি যদি একটি কোর থেকে অন্য কোরে চলে যায় তবে স্টপওয়াচটি অন্যান্য কোরগুলিতে মৃত্যুদন্ড কার্যকর করার সময়টিকে বিবেচনা করে না; থ্রেড কার্যকর করা শুরু যেখানে শুধুমাত্র এক। এ সম্পর্কে আপনার মতামত কী?
ম্যাথু লেটন 21

2
@ সিরিজ0ne, প্রবীণ বিকাশকারী আপনাকে স্টপওয়াচ এবং ডেটটাইম সম্পর্কে যা বলেছিল তা একেবারেই সত্য। ডেটটাইম ব্যতীত আপনার পর্যাপ্ত নির্ভুলতা নেই। সমস্যাটি হ'ল .NET তে এমন কোনও শ্রেণি নেই যা আপনাকে এই সমস্ত বৈশিষ্ট্যগুলি মঞ্জুর করে।
দারিন দিমিত্রভ

75

ব্যক্তিগত অভিজ্ঞতা থেকে, System.Diagnostics.Stopwatchক্লাসটি কোনও পদ্ধতির কার্যকরকরণের সময়টি পরিমাপ করতে ব্যবহার করা যেতে পারে, তবে, সতর্কতা : এটি সম্পূর্ণ সঠিক নয়!

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

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

এখন আপনি ভাবছেন; "ভাল কেন এটি প্রথমবারের মতো 132 মিমি নিয়েছে, এবং বাকি সময়গুলিতে উল্লেখযোগ্যভাবে কম?"

উত্তরটি হ'ল Stopwatchজাইটিংসের মতো .NET- এ "পটভূমি শব্দ" ক্রিয়াকলাপের ক্ষতিপূরণ দেয় না। অতএব আপনি যখন প্রথম নিজের পদ্ধতিটি চালান, নেট জাইটি এটি প্রথমে। এটি করার জন্য সময়টি কার্যকর করার সময় যুক্ত হয়। একইভাবে, অন্যান্য কারণগুলিও মৃত্যুদন্ড কার্যকর করার সময়কে আলাদা করতে পারে।

আপনার যা সত্যই নিখুঁত নির্ভুলতার সন্ধান করা উচিত তা হ'ল পারফরম্যান্স প্রোফাইলিং !

নিম্নলিখিতটি একবার দেখুন:

রেডগেট এএনটিএস পারফরম্যান্স প্রোফাইলার একটি বাণিজ্যিক পণ্য, তবে খুব সঠিক ফলাফল দেয়। - নেট অ্যাপ্লিকেশন সহ আপনার অ্যাপ্লিকেশনগুলির পারফরম্যান্সকে বুস্ট করুন

এখানে প্রোফাইলিং সম্পর্কিত একটি স্ট্যাকওভারফ্লো নিবন্ধ: - কিছু ভাল। নেট প্রোফাইলার কি?

স্টপওয়াচ ব্যবহার করে পারফরম্যান্স প্রোফাইলিংয়ের উপরে আমি একটি নিবন্ধও লিখেছি যা আপনি দেখতে চাইতে পারেন - .NETপারফরম্যান্স প্রোফাইলিং


2
@ মমিতিতাহসিলদারি কোন সমস্যা নেই আমি সাহায্য করতে পেরে আনন্দিত! :-)
ম্যাথু লেটন

41
আমি নিশ্চিত কেন এই একটি উদাহরণ নই ভ্রম । স্টপওয়াচটি প্রথম কলটির মোট দামটি নির্ভুলভাবে পরিমাপ করছে, যা অবশ্যই এই কোডটি চালাচ্ছে এমন গ্রাহকের সাথে প্রাসঙ্গিক। 13 132 মিলি সেকেন্ডগুলি পদ্ধতি নির্বাহের জন্য বা জিটারে চার্জ করা হচ্ছে কিনা সেগুলি তারা যত্ন করে না, মোট সময় কেটে গেছে সে সম্পর্কে তারা চিন্তা করে।
এরিক লিপার্ট

2
@ সিরিজ0ne যদি আপনি কোনও লুপের পারফরম্যান্সের বিষয়ে চিন্তা করেন তবে লুপটির কার্যকারিতাটি পরিমাপ করুন। সহজেই অনুমান করবেন না যে কোনও কিছু এন টাইম করার অর্থ এটি একবার কার্যকর করার সময় এটি ঠিক n গতি কম হবে।
সুইভ

3
প্রথমে, কোড নমুনাটি ক্রমবর্ধমান সংখ্যার সাথে আউটপুট উত্পাদন করা উচিত কারণ স্টপওয়াচ লুপটিতে কখনই পুনরায় সেট হয় না। এবং "উচিত" দ্বারা আমি বোঝাতে চাইছি (আমি পরীক্ষা করেছিলাম)। সুতরাং আপনার আউটপুট কোড মেলে না। দ্বিতীয়ত, যখন আমি লুপটিতে স্টপ / রাইটিং / রিসেট / স্টার্ট করার কোডটি সংশোধন করি তখন প্রথম পরিমাপটি বাকীটির মতোই ছিল। আমার অনুমান আপনার ডোসোমিংটি প্রথমবারের জন্য চালিত হওয়ার জন্য আরও কিছু করে। জেআইটি এর কারণ হতে পারে বা নাও হতে পারে তবে স্টপওয়াচ পরিমাপকে প্রভাবিত করছে না এমন নয়। অতএব -১।
ইলিয়া ব্রুডনো

2
ইলিয়া ব্রুডনো একেবারে সঠিক, আমি একই ফলাফল পেয়েছি। @ সিরিজ0, আপনার এখন পর্যন্ত এমএস লিখে লুপটির ভিতরে একটি কনসোল রয়েছে। রাইটলাইন; কারণ আপনি কেবল লুপটি শেষ হওয়ার পরে ঘড়িটি থামান, এটি প্রতিটি পুনরাবৃত্তির সাথে সময়ের সাথে সাথে ক্রমবর্ধমান হয়, তাই আমাদের মৃত্যুদন্ড কার্যকর করার সময় 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.ShopWatch একটি উচ্চ রেজোলিউশন টাইমার সরবরাহ করে।


একেবারে সঠিক! আমি কিছুটা হতাশ হয়ে পড়েছি যে এখানকার অনেকেই স্টপওয়াচটি ব্যবহারের পরামর্শ দিয়েছেন, কারণ এটি সম্পূর্ণ সঠিক নয়। তবে আপনি যেমন কোনও পারফরম্যান্স প্রোফাইলার ব্যবহার করার পরামর্শ দিয়েছেন, এটি করার সঠিক উপায় এটি! +1
ম্যাথু লেটন

7

স্টপওয়াচ উচ্চ-রেজোলিউশন কাউন্টার ব্যবহার করবে

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

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


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