CodeShot
BenchmarkDotNet1 دقیقه مطالعه

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.

این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←