0Pricing
C# Academy · درس

المفاضلة بين الإنتاجية وزمن الاستجابة

وازن بين إجمالي العمل في الثانية (الإنتاجية) والزمن لكل عنصر (زمن الاستجابة): قارن المعالجة لكل عنصر، والتجميع، وضبط درجة التوازي.

المفاضلة بين الإنتاجية وزمن الاستجابة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.

معدل النقل مقابل زمن الاستجابة

التعريفات:

  • معدل النقل: عدد العناصر في الثانية
  • زمن الاستجابة: الوقت اللازم لإنهاء عنصر واحد
  • المفاضلة: قد يؤدي التجميع ورفع درجة التوازي إلى زيادة معدل النقل، لكنه قد يؤخر العناصر الفردية

نمط المعالجة لكل عنصر

عالج كل عنصر فور وصوله: أقل وقت انتظار لكل عنصر، لكن النفقات الإضافية تتكرر مع كل عنصر.

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Simulate small per-item cost
  static void HandleItem(int x)
  {
    // Fixed overhead per item
    Thread.SpinWait(20000); // tiny CPU work
  }

  public static void Main(string[] args)
  {
    int n = 200;
    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < n; i++)
    {
      HandleItem(i);         // process immediately (no batching)
      // emit result right away (low latency style)
    }
    sw.Stop();
    Console.WriteLine("Per-item style: {0} ms for {1} items", sw.ElapsedMilliseconds, n);
  }
}

نمط التجميع

يقلل التجميع النفقات الإضافية المتكررة ويزيد معدل النقل، لكن العناصر المبكرة تنتظر امتلاء الدفعة، ما يرفع زمن الاستجابة.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;

public class Program
{
  static void ProcessBatch(List<int> batch)
  {
    // Amortize overhead across the whole batch
    Thread.SpinWait(20000);        // one-time overhead
    for (int i = 0; i < batch.Count; i++)
    {
      // small per-record work
      int val = batch[i] * 2;
      if (val == int.MinValue) { } // keep compiler from dropping work
    }
  }

  public static void Main(string[] args)
  {
    int n = 200;
    int batchSize = 20;
    List<int> current = new List<int>(batchSize);

    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < n; i++)
    {
      current.Add(i);
      if (current.Count == batchSize)
      {
        ProcessBatch(current);
        current.Clear(); // emit results after the batch finishes
      }
    }
    if (current.Count > 0) ProcessBatch(current);
    sw.Stop();

    Console.WriteLine("Batch style: {0} ms for {1} items (batch={2})", sw.ElapsedMilliseconds, n, batchSize);
  }
}

ضبط التوازي

قد يؤدي ضبط MaxDegreeOfParallelism إلى زيادة معدل النقل في العمل المقيّد بالمعالج؛ لكن رفعه أكثر من اللازم قد يضر الأداء بسبب تبديل السياق.

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static void Work(int x)
  {
    // CPU-bound unit
    Thread.SpinWait(40000);
  }

  public static void Main(string[] args)
  {
    int[] data = new int[200];
    for (int i = 0; i < data.Length; i++) data[i] = i;

    foreach (int dop in new int[] { 1, 2, 4 })
    {
      var opt = new ParallelOptions();
      opt.MaxDegreeOfParallelism = dop;

      Stopwatch sw = Stopwatch.StartNew();
      Parallel.ForEach(data, opt, Work);
      sw.Stop();

      Console.WriteLine("DOP={0} -> {1} ms", dop, sw.ElapsedMilliseconds);
    }
  }
}

فكرة الدفعات الصغيرة

يمكن أن تحقق الدفعات الصغيرة توازنًا بين الهدفين: معدل نقل أفضل من المعالجة لكل عنصر، وزمن استجابة أقل من الدفعات الضخمة.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static void ProcessBatch(List<int> batch)
  {
    Thread.SpinWait(15000); // small shared overhead
    for (int i = 0; i < batch.Count; i++) Thread.SpinWait(2000);
  }

  public static void Main(string[] args)
  {
    int n = 200;
    int micro = 5; // micro-batch size
    List<int> buf = new List<int>(micro);
    Stopwatch sw = Stopwatch.StartNew();

    for (int i = 0; i < n; i++)
    {
      buf.Add(i);
      if (buf.Count == micro)
      {
        ProcessBatch(buf);
        buf.Clear(); // emit more frequently than big batches
      }
    }
    if (buf.Count > 0) ProcessBatch(buf);

    sw.Stop();
    Console.WriteLine("Micro-batch (size={0}): {1} ms", micro, sw.ElapsedMilliseconds);
  }
}

نصائح الضبط

دليل الضبط:

  • قِس كلًا من ms/item وitems/sec
  • جرّب الدفعات الصغيرة أولًا
  • زد التوازي تدريجيًا؛ وراقب استخدام المعالج وعمليات تبديل السياق
  • استخدم قوائم انتظار محدودة لتجنب الانتظار الطويل ونمو الذاكرة

المفاضلة بين معدل النقل وزمن الاستجابة

تحقق سريع: ما التغيير الذي يحسّن عادةً معدل النقل، لكنه قد يزيد زمن الاستجابة لكل عنصر؟

مراجعة

مراجعة: المعالجة لكل عنصر = زمن استجابة منخفض ومعدل نقل أقل. الدفعات الكبيرة ودرجة التوازي المرتفعة = معدل نقل أعلى وزمن استجابة أكبر. تساعد الدفعات الصغيرة والضبط الدقيق لدرجة التوازي في تحقيق التوازن بينهما.

الأسئلة الشائعة

هل درس «المفاضلة بين الإنتاجية وزمن الاستجابة» مجاني؟

نعم — نص درس «المفاضلة بين الإنتاجية وزمن الاستجابة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.

ماذا ستتعلم في «المفاضلة بين الإنتاجية وزمن الاستجابة»؟

وازن بين إجمالي العمل في الثانية (الإنتاجية) والزمن لكل عنصر (زمن الاستجابة): قارن المعالجة لكل عنصر، والتجميع، وضبط درجة التوازي. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.

كم من الوقت يستغرق درس «المفاضلة بين الإنتاجية وزمن الاستجابة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Parallel.ForEach وPLINQ
  2. المنتِج/المستهلك باستخدام Channels (نظرة عامة)
  3. المفاضلة بين الإنتاجية وزمن الاستجابة
← العودة إلى C# Academy