BenchmarkDotNet چیست؟
کتابخانه استاندارد برای اندازهگیری دقیق و علمی زمان اجرا و مصرف حافظه کد داتنت، بهجای اندازهگیری دستی با Stopwatch.
چرا مهم است؟
اندازهگیری دستی با Stopwatch بهخاطر JIT Warm-up، Garbage Collection و نویز سیستمعامل عملاً غیرقابلاعتماد است؛ BenchmarkDotNet این عوامل را کنترل میکند و نتیجهای آماری و تکرارپذیر میدهد.
تعریف
BenchmarkDotNet کتابخانهای است که یک متد را چندین بار (بعد از Warm-up کردن JIT) اجرا میکند و میانگین زمان اجرا، انحراف معیار و میزان تخصیص حافظه (Allocation) را با دقت بالا گزارش میدهد.
مثال
[MemoryDiagnoser]
public class StringConcatBenchmark
{
[Benchmark(Baseline = true)]
public string StringConcat()
{
var result = "";
for (int i = 0; i < 1000; i++) result += i;
return result;
}
[Benchmark]
public string StringBuilderConcat()
{
var sb = new StringBuilder();
for (int i = 0; i < 1000; i++) sb.Append(i);
return sb.ToString();
}
}
// اجرا: BenchmarkRunner.Run<StringConcatBenchmark>();
چرا نه فقط Stopwatch
Stopwatch یک بار اجرا را اندازه میگیرد که هنوز شامل هزینه JIT Compile و نویز سیستمعامل است؛ BenchmarkDotNet صدها/هزاران بار اجرا میکند، Outlier را حذف میکند و نتیجه آماری معتبر میدهد.
اشتباه رایج
❌ اجرای Benchmark در حالت Debug — بهینهسازیهای کامپایلر در Debug غیرفعال است و نتایج کاملاً گمراهکننده میشوند؛ همیشه در Release اجرا شود.
منبع و مطالعه بیشتر
خلاصه
BenchmarkDotNet با اجرای تکرارشونده و کنترلشده، زمان اجرا و مصرف حافظه کد را با دقت آماری اندازه میگیرد، برخلاف Stopwatch ساده. همیشه در حالت Release اجرا شود، نه Debug. مرجع کامل: مستندات رسمی BenchmarkDotNet.
