ما هو BenchmarkDotNet ولماذا تحتاجه؟
BenchmarkDotNet هي مكتبة قوية ومفتوحة المصدر ومتعددة المنصات لـ .NET، مصممة لقياس أداء الكود بدقة (بينشمارك). في عالم تطوير البرمجيات، غالبًا ما نحتاج لمقارنة نهجين أو أكثر لحل مشكلة واحدة: أي خوارزمية فرز أسرع؟ أي طريقة لتنسيق النصوص أكثر كفاءة؟ كيف يؤثر استخدام هياكل بيانات مختلفة على سرعة التطبيق؟ BenchmarkDotNet تحل هذه المشكلة بمستوى احترافي.
لماذا تحتاجها؟ القياس اليدوي للوقت باستخدام Stopwatch محفوف بالعديد من الأخطاء: تأثير عمليات الخلفية مثل JIT-compilation، جمع القمامة (GC)، تسخين ذاكرة التخزين المؤقت للمعالج، وأخطاء المؤقت النظامي. BenchmarkDotNet تقوم تلقائيًا بما يلي:
- التسخين (Warmup): تشغيل الكود عدة مرات قبل القياس لضمان استقرار JIT-compiler وذاكرة التخزين المؤقت.
- التكرارات المتعددة (Iterations): تنفيذ الطريقة مرات عديدة وجمع الإحصائيات.
- التحليل الإحصائي: حساب المتوسط، الوسيط، الانحراف المعياري، الحد الأدنى والحد الأقصى للوقت.
- العزل: تشغيل كل بينشمارك في عملية منفصلة لتقليل تأثير الاختبارات الأخرى.
- التشخيص: قياس ليس فقط الوقت، ولكن أيضًا تخصيص الذاكرة (Allocated)، عدد مرات جمع القمامة (GC Collections)، ومقاييس أخرى.
بدون BenchmarkDotNet، أنت تخاطر بالحصول على نتائج غير موثوقة واتخاذ قرارات خاطئة بشأن تحسين الكود.
تثبيت BenchmarkDotNet
يتم تثبيت مكتبة BenchmarkDotNet في مشروع .NET (C#, F#, VB.NET) عبر مدير الحزم NuGet. هناك ثلاث طرق رئيسية:
1. عبر .NET CLI (موصى به)
افتح الطرفية في المجلد الجذري لمشروعك ونفذ الأمر:
dotnet add package BenchmarkDotNet
2. عبر Package Manager Console في Visual Studio
افتح القائمة Tools -> NuGet Package Manager -> Package Manager Console ونفذ:
Install-Package BenchmarkDotNet
3. عبر واجهة NuGet الرسومية في Visual Studio
انقر بزر الماوس الأيمن على المشروع في Solution Explorer، اختر "Manage NuGet Packages"، ابحث عن "BenchmarkDotNet" واضغط "Install".
هام: لكي تعمل المكتبة بشكل صحيح، يجب بناء المشروع في وضع Release. وضع Debug لا يقوم بتحسين الكود، مما يؤدي إلى نتائج مشوهة.
بداية سريعة مع مثال كود
لنكتب بينشمارك بسيطًا يقارن بين طريقتين لدمج النصوص: باستخدام عامل + وباستخدام StringBuilder.
1. أنشئ مشروع وحدة تحكم .NET جديد: dotnet new console -n MyBenchmark.
2. ثبت المكتبة: dotnet add package BenchmarkDotNet.
3. استبدل محتوى ملف Program.cs بالكود التالي:
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Text;
public class StringConcatenationBenchmark
{
private const int N = 1000; // عدد التكرارات داخل الطريقة
[Benchmark]
public string UsingPlusOperator()
{
string result = "";
for (int i = 0; i < N; i++)
{
result = result + "a";
}
return result;
}
[Benchmark]
public string UsingStringBuilder()
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++)
{
sb.Append("a");
}
return sb.ToString();
}
}
public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<StringConcatenationBenchmark>();
}
}