تحليل أداء كود C#: إيجاد نقاط الاختناق عمليًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحليل أداء كود C#: إيجاد نقاط الاختناق عمليًا

\n

تحسين الأداء هو أحد المهام الرئيسية للمطور. حتى أجمل كود يمكن أن يعمل ببطء إذا كان يحتوي على نقاط اختناق. في هذه المقالة، سنشرح كيفية تحليل أداء كود C# في بيئة .NET، وإيجاد الأجزاء المشكلة وإصلاحها. ستتعرف على أدوات عملية مثل BenchmarkDotNet و dotMemory و Stopwatch المدمج، وستحصل على أمثلة جاهزة للتحليل.

\n\n

لماذا يعتبر تحليل الأداء مهمًا؟

\n

تحليل الأداء ليس مجرد تشغيل التطبيق وقياس الوقت. إنه نهج منهجي لتحديد "الاختناقات": الخوارزميات البطيئة، تسربات الذاكرة، استعلامات قاعدة البيانات غير المثلى، أو التخصيصات المتكررة على الكومة. بدون تحليل الأداء، فإنك تخاطر بقضاء ساعات في تحسين الأجزاء التي تعمل بسرعة بالفعل، متجاهلاً المشاكل الحقيقية.

\n\n

1. تحليل الأداء باستخدام Stopwatch (بداية سريعة)

\n

أبسط طريقة لقياس وقت تنفيذ الكود هي استخدام الفئة System.Diagnostics.Stopwatch. إنها مناسبة للتقييم الأولي، ولكن ليس للمعايير الدقيقة بسبب تأثير تجميع JIT والعمليات الخلفية.

\n\n

مثال على استخدام Stopwatch

\n
using 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\n

2. تحليل الأداء الاحترافي باستخدام BenchmarkDotNet

\n

BenchmarkDotNet هو المعيار الذهبي للمعايير في .NET. يقوم تلقائيًا بتسخين الكود، وتشغيل عدة تكرارات، وتحليل الإحصائيات، ومراعاة تأثير جامع القمامة. قم بتثبيت الحزمة عبر NuGet:

\n
dotnet add package BenchmarkDotNet
\n\n

مثال على معيار لمقارنة طريقتين

\n
using 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 والربط باستخدام + بشكل موضوعي.

\n\n

3. تحليل الذاكرة باستخدام dotMemory وأدوات تشخيص Visual Studio

\n

لا تقتصر نقاط الاختناق على السرعة فحسب، بل تشمل أيضًا استهلاك الذاكرة. تساعد أداة dotMemory من JetBrains والأدوات المدمجة في Visual Studio (Diagnostic Tools) في العثور على تسربات الذاكرة، والتخصيصات المتكررة، والكائنات التي تعيش طويلاً في الكومة.

\n\n

كيفية استخدام أدوات تشخيص Visual Studio

\n
    \n
  • قم بتشغيل التطبيق في وضع Debug.
  • \n
  • افتح نافذة Diagnostic Tools (Debug → Windows → Show Diagnostic Tools).
  • \n
  • قم بتفعيل تحليل الذاكرة (Memory Usage) أو وحدة المعالجة المركزية (CPU Usage).
  • \n
  • التقط لقطة للذاكرة (Snapshot) قبل وبعد تنفيذ الكود.

المدونات

توصيات الكتب