تحليل أداء كود C#: إيجاد نقاط الاختناق عمليًا
\nتحسين الأداء هو أحد المهام الرئيسية للمطور. حتى أجمل كود يمكن أن يعمل ببطء إذا كان يحتوي على نقاط اختناق. في هذه المقالة، سنشرح كيفية تحليل أداء كود C# في بيئة .NET، وإيجاد الأجزاء المشكلة وإصلاحها. ستتعرف على أدوات عملية مثل BenchmarkDotNet و dotMemory و Stopwatch المدمج، وستحصل على أمثلة جاهزة للتحليل.
لماذا يعتبر تحليل الأداء مهمًا؟
\nتحليل الأداء ليس مجرد تشغيل التطبيق وقياس الوقت. إنه نهج منهجي لتحديد "الاختناقات": الخوارزميات البطيئة، تسربات الذاكرة، استعلامات قاعدة البيانات غير المثلى، أو التخصيصات المتكررة على الكومة. بدون تحليل الأداء، فإنك تخاطر بقضاء ساعات في تحسين الأجزاء التي تعمل بسرعة بالفعل، متجاهلاً المشاكل الحقيقية.
\n\n1. تحليل الأداء باستخدام Stopwatch (بداية سريعة)
\nأبسط طريقة لقياس وقت تنفيذ الكود هي استخدام الفئة System.Diagnostics.Stopwatch. إنها مناسبة للتقييم الأولي، ولكن ليس للمعايير الدقيقة بسبب تأثير تجميع JIT والعمليات الخلفية.
مثال على استخدام Stopwatch
\nusing System.Diagnostics;\n\npublic class Example\n{\n public void Run()\n {\n Stopwatch sw = Stopwatch.StartNew();\n\n // الكود الذي تريد قياسه\n SimulateWork();\n\n sw.Stop();\n Console.WriteLine($"وقت التنفيذ: {sw.ElapsedMilliseconds} مللي ثانية");\n }\n\n private void SimulateWork()\n {\n for (int i = 0; i < 1_000_000; i++)\n {\n // محاكاة العمل\n }\n }\n}\nالعيوب: لا يأخذ Stopwatch في الاعتبار تسخين JIT، أو جمع القمامة، أو عوامل أخرى. للتحليل الجاد، استخدم المكتبات المتخصصة.
\n\n2. تحليل الأداء الاحترافي باستخدام BenchmarkDotNet
\nBenchmarkDotNet هو المعيار الذهبي للمعايير في .NET. يقوم تلقائيًا بتسخين الكود، وتشغيل عدة تكرارات، وتحليل الإحصائيات، ومراعاة تأثير جامع القمامة. قم بتثبيت الحزمة عبر NuGet:
dotnet add package BenchmarkDotNet\n\nمثال على معيار لمقارنة طريقتين
\nusing BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\n\npublic class StringBenchmark\n{\n private string[] data = { "apple", "banana", "cherry", "date" };\n\n [Benchmark]\n public string ConcatWithPlus()\n {\n string result = "";\n foreach (var s in data)\n result += s;\n return result;\n }\n\n [Benchmark]\n public string ConcatWithStringBuilder()\n {\n var sb = new System.Text.StringBuilder();\n foreach (var s in data)\n sb.Append(s);\n return sb.ToString();\n }\n}\n\npublic class Program\n{\n public static void Main()\n {\n var summary = BenchmarkRunner.Run<StringBenchmark>();\n }\n}\nبعد التشغيل، سترى جدولاً بالوقت وتخصيصات الذاكرة والأخطاء. سيسمح لك هذا بمقارنة StringBuilder والربط باستخدام + بشكل موضوعي.
3. تحليل الذاكرة باستخدام dotMemory وأدوات تشخيص Visual Studio
\nلا تقتصر نقاط الاختناق على السرعة فحسب، بل تشمل أيضًا استهلاك الذاكرة. تساعد أداة dotMemory من JetBrains والأدوات المدمجة في Visual Studio (Diagnostic Tools) في العثور على تسربات الذاكرة، والتخصيصات المتكررة، والكائنات التي تعيش طويلاً في الكومة.
كيفية استخدام أدوات تشخيص Visual Studio
\n- \n
- قم بتشغيل التطبيق في وضع Debug. \n
- افتح نافذة Diagnostic Tools (Debug → Windows → Show Diagnostic Tools). \n
- قم بتفعيل تحليل الذاكرة (Memory Usage) أو وحدة المعالجة المركزية (CPU Usage). \n
- التقط لقطة للذاكرة (Snapshot) قبل وبعد تنفيذ الكود.