System.Diagnostics.Stopwatch ক্লাস হাই-রেজোলিউশন টাইমার প্রদান করে যা কোড এক্সিকিউশন টাইম মাপার জন্য আদর্শ। এটি CPU সাইকেল বা হাই-প্রিসিশন হার্ডওয়্যার টাইমার ব্যবহার করে।
বেসিক ব্যবহার
using System;
using System.Diagnostics;
var stopwatch = Stopwatch.StartNew(); // শুরু + তৈরি একসাথে
// কোড যা মাপতে চান
DoWork();
stopwatch.Stop();
Console.WriteLine($"এলাপসড টাইম: {stopwatch.ElapsedMilliseconds} ms");
// অথবা
Console.WriteLine($"এলাপসড: {stopwatch.Elapsed}"); // TimeSpan ফরম্যাট
সম্পূর্ণ উদাহরণ
using System;
using System.Diagnostics;
using System.Threading;
public class Demo
{
public static void Main(string[] args)
{
var sw = Stopwatch.StartNew();
// সিমুলেটেড কাজ
Display();
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"সময়: {sw.ElapsedMilliseconds} ms");
Thread.Sleep(100); // ১০০ মিলিসেকেন্ড দেরি
}
sw.Stop();
Console.WriteLine($"\nমোট এলাপসড: {sw.Elapsed}");
Console.WriteLine($"মোট মিলিসেকেন্ড: {sw.ElapsedMilliseconds}");
Console.WriteLine($"মোট টিকস: {sw.ElapsedTicks}");
}
public static void Display()
{
Console.WriteLine("ডেমো ফাংশন!");
Thread.Sleep(50);
}
}
আউটপুট উদাহরণ
ডেমো ফাংশন!
সময়: 51 ms
সময়: 152 ms
সময়: 253 ms
সময়: 354 ms
সময়: 455 ms
মোট এলাপসড: 00:00:00.4552312
মোট মিলিসেকেন্ড: 455
মোট টিকস: 1138078
Stopwatch প্রপার্টি রেফারেন্স
| প্রপার্টি/মেথড | ব্যাখ্যা |
|---|---|
StartNew() | নতুন ইনস্ট্যান্স তৈরি করে এবং শুরু করে (স্ট্যাটিক ফ্যাক্টরি) |
Start() | রুকা हुआ স্টপওয়াচ শুরু করে |
Stop() | স্টপওয়াচ বন্ধ করে |
Reset() | শূন্য করে এবং বন্ধ করে |
Restart() | Reset() + Start() একসাথে |
Elapsed | TimeSpan রিটার্ন করে (উচ্চ প্রিসিশন) |
ElapsedMilliseconds | লং আকারে মিলিসেকেন্ড |
ElapsedTicks | র حم টাইমার টিকস (CPU ফ্রিকোয়েন্সি-নির্ভর) |
IsRunning | চালু আছে কিনা |
বেঞ্চমার্কিং-এর জন্য সেরা অনুশীলন
using System.Diagnostics;
using System.Runtime.CompilerServices;
public static class Benchmark
{
public static double Measure(Action action, int iterations = 1000)
{
// WARm-up (JIT কম্পাইলেশন, ক্যাশে ফিলআপ)
for (int i = 0; i < 10; i++) action();
var sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
action();
}
sw.Stop();
return sw.Elapsed.TotalMilliseconds / iterations; // গড়ে মিলিসেকেন্ড
}
}
// ব্যবহার
double avgMs = Benchmark.Measure(() =>
{
// টেস্ট কোড এখানে
var sum = 0;
for (int i = 0; i < 1000; i++) sum += i;
}, 10000);
Console.WriteLine($"গড়ে প্রতি কল: {avgMs:F4} ms");
BenchmarkDotNet - প্রোফেশনাল বেঞ্চমার্কিং (সুপারিশ করা)
// NuGet: BenchmarkDotNet
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
[MemoryDiagnoser]
public class MyBenchmarks
{
[Benchmark]
public void StringConcat() => string.Concat("a", "b", "c");
[Benchmark]
public void StringInterpolation() => $"{"a"}{"b"}{"c"}";
}
// রান করতে
BenchmarkRunner.Run<MyBenchmarks>();
সাধারণ ভুল এড়ান
DateTime.Nowব্যবহার করা (কম প্রিসিশন, সিস্টেম ক্লক চেঞ্জের আশ্রয়ী) →Stopwatchব্যবহার করুন- वार্ম-আপ ছাড়া বেঞ্চমার্ক করা (JIT কম্পাইলেশন ফলাফল বিকৃত করে)
- Debug বিল্ডে বেঞ্চমার্ক করা (অপ্টিমাইজেশন অফ থাকে) → Release বিল্ডে রান করুন
- খুব কম ইটারেশন (নויז বেশি) → ন্যূনতম ১০০০+ ইটারেশন