C# Academy · บทเรียน

การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง

สร้างสมดุลระหว่างงานทั้งหมดต่อวินาที (อัตราการประมวลผล) กับเวลาต่อรายการ (เวลาแฝง): เปรียบเทียบการประมวลผลรายรายการ การประมวลผลเป็นชุด และการปรับระดับความขนาน

บทเรียน 3 จาก 38 ขั้นตอน

การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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 อาจเพิ่มปริมาณงานต่อเวลาสำหรับงานที่ใช้ CPU เป็นหลัก แต่ค่าที่สูงเกินไปอาจทำให้ประสิทธิภาพลดลงเนื่องจากการสลับบริบท

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);
  }
}

เคล็ดลับการปรับค่า

แนวทางการปรับค่า:

  • วัดทั้ง มิลลิวินาทีต่อรายการ และ รายการต่อวินาที
  • ลองใช้ ชุดย่อยขนาดเล็กก่อน
  • เพิ่มระดับการทำงานแบบขนานทีละน้อย พร้อมดูการใช้ CPU และการสลับบริบท
  • กำหนดขอบเขตของคิวเพื่อหลีกเลี่ยงการรอนานและการใช้หน่วยความจำเพิ่มขึ้น

จุดแลกเปลี่ยนระหว่างปริมาณงานต่อเวลากับเวลาแฝง

ตรวจสอบความเข้าใจอย่างรวดเร็ว: การเปลี่ยนแปลงใดโดยทั่วไปช่วยเพิ่มปริมาณงานต่อเวลา แต่สามารถเพิ่มเวลาแฝงของแต่ละรายการได้

ทบทวน

ทบทวน: ทำทีละรายการ = เวลาแฝงต่ำ ปริมาณงานต่อเวลาต่ำ ชุดขนาดใหญ่หรือระดับความขนานสูง = ปริมาณงานต่อเวลาสูง เวลาแฝงสูง การใช้ชุดย่อยขนาดเล็กและการปรับระดับความขนานอย่างรอบคอบช่วยสร้างสมดุลระหว่างทั้งสองด้าน

เริ่มต้นได้ฟรี

เรียนรู้ C# ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
93
บทเรียน
346

คำถามที่พบบ่อย

บทเรียน “การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง”

สร้างสมดุลระหว่างงานทั้งหมดต่อวินาที (อัตราการประมวลผล) กับเวลาต่อรายการ (เวลาแฝง): เปรียบเทียบการประมวลผลรายรายการ การประมวลผลเป็นชุด และการปรับระดับความขนาน คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน

บทเรียน “การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Parallel.ForEach และ PLINQ
  2. ผู้ผลิต/ผู้บริโภคด้วย Channels (ภาพรวม)
  3. การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง
← กลับไปที่ C# Academy