การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง
สร้างสมดุลระหว่างงานทั้งหมดต่อวินาที (อัตราการประมวลผล) กับเวลาต่อรายการ (เวลาแฝง): เปรียบเทียบการประมวลผลรายรายการ การประมวลผลเป็นชุด และการปรับระดับความขนาน
การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Parallel.ForEach และ PLINQ
- ผู้ผลิต/ผู้บริโภคด้วย Channels (ภาพรวม)
- การแลกเปลี่ยนระหว่างอัตราการประมวลผลกับเวลาแฝง