غوص عميق في أداء .NET: بناء تطبيقات أسرع وأنحف وأكثر ذكاءً

١٩ أكتوبر ٢٠٢٥

.NET Performance Deep Dive: Building Faster, Leaner, Smarter Apps

الأداء في .NET ليس مجرد سرعة خام — بل يتعلق بالكفاءة وقابلية التوسع وجعل كل دورة CPU وكل تخصيص ذاكرة يحسب.
سواء كنت تبني API ASP.NET Core عالي الحركة، أو واجهة أمامية Blazor، أو تطبيق MAUI متعدد المنصات، أو خدمة Worker Service في الخلفية، فإن الأداء يحدد كلًا من تجربة المستخدم وتكلفة التشغيل.

مع وصول .NET 9، تستمر Microsoft في تحسين CoreCLR، وقت التشغيل الذي يشغّل .NET الحديث. تقدم المنصة تحسينات JIT أكذكاءً، وجمعًا تلقائيًا للقمامة (GC) متكيفًا، وتحسينًا شاملًا لوقت التشغيل باستخدام التوجيه المستند إلى الملف (PGO) الدرجي — مفعّل الآن افتراضيًا. والنتيجة هي وقت تشغيل يبدأ أسرع، وينفذ بشكل أسرع، ويتوسع بشكل أكثر قابلية للتنبؤ عبر أحمال عمل متنوعة.

في هذا الغوص العميق، ستستكشف كيف يعمل أداء .NET 9، ولماذا يهم، وكيف تقيسه وتشخصه وتتحسنه بمسؤولية — مستندًا إلى البيانات والفروقات الدقيقة في العالم الحقيقي.


فهم أساسيات أداء .NET

في جوهره، يقيس أداء .NET مدى كفاءة تطبيقك في استخدام موارد وحدة المعالجة المركزية والذاكرة والإدخال/الإخراج والشبكة لتقديم سلوك منخفض التأخير وسريع الاستجابة.

يشارك كل تطبيق .NET نفس الأسس الأساسية:

  • ذاكرة مُدارة عبر GC
  • ترجمة JIT أو AOT، حسب النشر
  • الإدخال/الإخراج غير المتزامن والمؤشرات للتزامن
  • محرك تنفيذ CoreCLR الذي يجدول ويحسّن عمل وقت التشغيل

ميزة وقت التشغيل المُدار

يختزل وقت تشغيل CoreCLR الخاص بـ .NET 9 التعقيدات منخفضة المستوى مع منح المطورين شفافية وتحكمًا أعمق.

جمع القمامة الأذكى

يقوم GC باستعادة الذاكرة تلقائيًا، لكن أنماط التخصيص غير الكفؤة لا تزال يمكن أن تسبب توقفات.
يقدم .NET 9 ضبطًا تكيفيًا للأكوام الكبيرة وأوضاعًا محسّنة منخفضة التأخير — وليس "تراصًا أسرع للجيل الثاني" على وجه التحديد، بل مكاسب قابلة للقياس في أحمال العمل المستمرة.

الترجمة الدرجية وPGO

يقوم مترجم JIT بتوليد شفرة أصلية محسّنة ديناميكيًا.
مع تفعيل PGO الدرجي افتراضيًا، يحلل .NET 9 ملفات التعريف وقت التشغيل لتحديد المسارات الساخنة وتطبيق تحسينات خاصة بالآلة — لكن تحسينات الأداء تعتمد على حمل العمل ومدة تشغيل التطبيق. تستفيد بعض المسارات على الفور؛ بينما تحتاج أخرى إلى وقت لجمع البيانات (مدونة Microsoft Dev – تحسينات أداء .NET 9).

التزامن غير المتزامن وعدالة المؤشرات

تبسط Async/await التزامن لكن يمكن أن تثقل حمل مجموعة المؤشرات إذا لم يتم قياسها.
يحسّن .NET 9 عدالة جدولة المهام والتخفيف من تجويع مجموعة المؤشرات على ARM64 وmacOS، مما يوفر أداءً غير متزامن أكثر سلاسة عبر البنى.


القياس قبل التحسين

قبل تغيير سطر واحد، قم بالقياس. التحسين بدون أدلة يضيع الجهد أو حتى يسبب تراجعات.

اختبارات أداء دقيقة مع BenchmarkDotNet

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

public class StringConcatBenchmarks {
    private const string Sample = "performance";

    [Benchmark]
    public string UsingPlus() => Sample + Sample + Sample;

    [Benchmark]
    public string UsingStringBuilder() {
        var sb = new System.Text.StringBuilder();
        sb.Append(Sample);
        sb.Append(Sample);
        sb.Append(Sample);
        return sb.ToString();
    }
}

BenchmarkRunner.Run<StringConcatBenchmarks>();

يُنشئ بنچمارك دوت نت تقارير مفصلة (متوسط الوقت، التخصيصات، التباين) حتى تُحسِّن بناءً على الأدلة — وليس الافتراضات (توثيق بنچمارك دوت نت).

تحليل تطبيقات حقيقية

للأحمال العمل المباشرة:

  • dotnet-trace – تتبع الأحداث
  • dotnet-counters – مقاييس الوقت الفعلي
  • dotnet-monitor – جمع موحد (لتطبيقات الإنتاج)
  • Visual Studio Profiler – عرض الخط الزمني
  • مثال:

    dotnet-counters monitor --process-id 12345 System.Runtime
    

    💡 نصيحة التفسير:
    إذا كان "٪ الوقت في GC" > 10٪ باستمرار → تطبيقك مقيد بضغط الذاكرة.
    راقب توازن وحدة المعالجة المركزية مقابل GC قبل تعديل الكود.


    كفاءة وحدة المعالجة المركزية: جعل كل دورة تهم

    يستخدم JIT الخاص بـ .NET 9 التجميع الطبقي الديناميكي مع PGO لدمج المسارات الساخنة بشكل عدواني - لا تزال خيارات التصميم مهمة.

    • تجنب التغليف/إلغاء التغليف (استخدم الأنواع العامة أو Span<T>).
    • تجنب LINQ في الحلقات الضيقة - التكرار اليدني يقلل التخصيصات.
    • استخدم SIMD حيثما كان مناسبًا: للكود الرقمي أو الوسائط، استفد من Vector128 و Vector256.

    ⚠️ Vector512 توجد واجهات برمجة التطبيقات في System.Runtime.Intrinsics.Experimental وقد تتغير؛ يضيف .NET 9 دعم AVX512 وARM64 JIT، لكنها ليست رائجة بعد (GitHub PR #104972).
    توقع تسريعات 2–4× في الكود الثقيل بالرياضيات فقط - وليس في منطق الويب النموذجي (Microsoft Learn – SIMD Overview).


    كفاءة الذاكرة: إدارة المجموعة المدارة

    • اجعل معظم التخصيصات قصيرة العمر (الجيل 0/1).
    • تذهب الكائنات الكبيرة (> 85 كيلوبايت) إلى LOH - مضغوطة الآن بشكل أكثر تكيفًا تحت الحمل.
    • استخدم ArrayPool<T> أو MemoryPool<T> لإعادة تدوير المخازن المؤقتة.
    • فضل Span<T> و Memory<T> لتجنب التخصيصات الإضافية.

    تجميع الكائنات (على سبيل المثال، DefaultObjectPool<T>) يقلل من دوران GC - مثالي لواجهة ASP.NET Core الوسيطة والمسيرات.


    أداء الإدخال/الإخراج والشبكة

    استخدم واجهات برمجة التطبيقات غير المتزامنة لتحرير المؤشرات أثناء الإدخال/الإخراج:

    var response = await httpClient.GetStringAsync(url);
    

    أنماط المنتج/المستهلك، System.Threading.Channels فعالة.
    للإدخال/الإخراج الشبكي عالي الإنتاجية، System.IO.Pipelines (المستخدمة بواسطة Kestrel) توفر بثًا منخفض النسخ مثاليًا لخوادم المقابس ووكلاء HTTP.


    أداء ASP.NET Core في .NET 9

    يستمر ASP.NET Core في التصنيف بين أسرع الأطر عالميًا (انظر TechEmpower Round 23 الذي يظهر +10–15٪ مقابل .NET 8).

    تحسين Kestrel وHTTP

    • فعّل HTTP/2 أو HTTP/3 للبث المتزامن.
    • احتفظ بجلسات TLS مخزنة مؤقتًا.
    • استخدم System.IO.Pipelines لتقليل التخزين المؤقت.

    الوسيط والتخزين المؤقت

    الترتيب مهم - ضع الوسطاء خفيفي الوزن أولاً:

    app.UseResponseCompression();
    app.UseResponseCaching();
    

    EF Core 9: النماذج المترجمة وأداء الاستعلام

    يقدم EF Core 9 نماذج مترجمة، مما يقلل من انعكاس وقت التشغيل وتكاليف البيانات الوصفية:

    dotnet ef dbcontext optimize
    

    يمكن أن يحسن هذا الأداء بشكل ملحوظ في النماذج الكبيرة والمستقرة — على الرغم من أنه قد يزيد وقت بدء التشغيل للتطبيقات الأصغر (EF Core 9 GitHub المشكلة #33992).


    كفاءة عميل Blazor وMAUI

    Blazor WebAssembly

    تستفيد إصدارات .NET 9 من التجميع AOT والاقتطاع والتحميل الكسول.
    استخدم ضغط Brotli وتقسيم التجميعات لتحميل أول أسرع.

    Blazor Server

    دفع تحديثات واجهة المستخدم وتقليل رحلات SignalR ذهابًا وإيابًا.

    .NET MAUI

    استخدم الربط المترجم (x:DataType) لتجنب الانعكاس.
    أزل أعباء العمل الخلفية عبر أنماط async.


    خدمات العامل والمهام الخلفية

    تستفيد العمليات طويلة الأمد من الدفع ومراقبة الذاكرة:

    • دفع الرسائل لتقليل التكلفة لكل عنصر.
    • التقاط dotnet-gcdump بشكل دوري.
    • استخدام IHostApplicationLifetime للإيقافات السلسة.

    التشخيص والملاحظة

    dotnet-monitor (مُجمَّع الآن في SDK 9)

    يجمع المقاييس والتتبعات والتفريغات للتطبيقات الحاوية:

    dotnet monitor collect --process-id 12345
    

    (Microsoft Learn – نظرة عامة على أدوات التشخيص)

    OpenTelemetry وEventCounters

    صدر التتبعات إلى Grafana أو Azure Monitor أو Prometheus للإمساك بتراجعات الكمون مبكرًا.


    تحسينات وقت التشغيل المتقدمة

    ReadyToRun (R2R)

    تجميعات Pre-JIT لبدء تشغيل أسرع:

    dotnet publish -c Release -p:PublishReadyToRun=true
    

    Tiered PGO (الافتراضي في .NET 9)

    يحلل بيانات التنفيذ الفعلية ويحسن مسارات الشيفرة الساخنة.
    مُفعَّل افتراضيًا، لكن الفوائد تعتمد على استقرار ملف وقت التشغيل (Microsoft Dev Blog – تحسينات أداء .NET 9).

    Native AOT

    يدعم الآن واجهات برمجة تطبيقات مصغرة للخدمات المصغرة:

    dotnet publish -c Release -p:PublishAot=true
    

    ✅ يزيل AOT JIT ويقلل وقت البدء البارد بنسبة تصل إلى 60 %.
    ⚠️ ومع ذلك، يحد من الشيفرة الديناميكية والانعكاس وبعض المكتبات (SignalR أو المكونات الإضافية) (Microsoft Learn – توثيق Native AOT).


    أخطاء الأداء الشائعة

    • إعادة إنشاء HttpClient أو DbContext لكل طلب
    • حظر مكالمات async باستخدام .Result() أو .Wait()
    • إطلاق مهام غير محددة دون تقييد
    • تجاهل مقاييس GC
    • التخزين المؤقت المفرط للكائنات الكبيرة

    ✅ قائمة مراجعة الأداء السريعة

    • قم بالتحليل قبل التحسين
    • راقب GC والتخصيصات
  • تفضيل الإدخال/الإخراج غير المتزامن
  • التخزين المؤقت بذكاء
  • التحقق باستخدام BenchmarkDotNet

  • الخلاصة: الأداء كثقافة

    الأداء ليس خطوة نهائية — إنه عادة.
    مع دوت نت 9، يكتسب المطورون منصة تكافئ التصميم المتعمد، والضبط المقاس، والتكرار القائم على البيانات.
    من خلال الاستفادة من JIT الحديث الخاص بـ CoreCLR، و GC التكيفي، و AOT الأصلي (حيثما يكون مناسبًا)، يمكنك بناء تطبيقات سريعة كالبرق وفعالة للسحابة.

    ابدأ التحليل اليوم. قم بالتحسين بشكل متعمد. كرر باستمرار.
    مستخدموك — وفاتورة السحابة الخاصة بك — سيشكرونك.


    مراجع