0Pricing
C# Academy · Pelajaran

Pertukaran antara throughput dan latensi

Seimbangkan total pekerjaan per detik (throughput) dengan waktu per item (latensi): bandingkan pemrosesan per item, pemrosesan berkelompok, dan penyetelan tingkat paralelisme.

Pertukaran antara throughput dan latensi adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.

Laju pemrosesan dibandingkan latensi

Definisi:

  • Laju pemrosesan: jumlah item per detik
  • Latensi: waktu untuk menyelesaikan satu item
  • Kompromi: pengelompokan dan paralelisme yang lebih tinggi dapat meningkatkan laju pemrosesan, tetapi menunda item secara individual

Gaya per item

Proses setiap item saat tiba: waktu tunggu per item minimal, tetapi biaya tambahan berulang untuk setiap item.

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

Gaya pengelompokan

Pengelompokan mengurangi biaya tambahan yang berulang dan meningkatkan laju pemrosesan, tetapi item yang datang lebih awal harus menunggu hingga kelompok penuh (latensi lebih tinggi).

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

Penyetelan paralelisme

Menyetel MaxDegreeOfParallelism dapat meningkatkan laju pemrosesan untuk pekerjaan yang terikat CPU; nilai yang terlalu tinggi dapat menurunkannya karena perpindahan konteks.

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

Gagasan kelompok mikro

Kelompok mikro dapat menyeimbangkan kedua tujuan: laju pemrosesan lebih baik daripada pemrosesan per item, dengan latensi lebih rendah daripada kelompok yang sangat besar.

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

Kiat penyetelan

Panduan penyetelan:

  • Ukur ms/item dan items/sec
  • Coba kelompok mikro terlebih dahulu
  • Naikkan paralelisme secara perlahan; amati CPU dan perpindahan konteks
  • Batasi antrean untuk menghindari waktu tunggu yang panjang dan pertumbuhan penggunaan memori

Kompromi laju pemrosesan dan latensi

Pemeriksaan singkat: Perubahan apa yang biasanya meningkatkan laju pemrosesan, tetapi dapat meningkatkan latensi per item?

Ringkasan

Ringkasan: Per item = latensi rendah, laju pemrosesan lebih rendah. Kelompok besar/DOP tinggi = laju pemrosesan lebih tinggi, latensi lebih tinggi. Kelompok mikro dan penyetelan DOP yang cermat membantu menyeimbangkan keduanya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pertukaran antara throughput dan latensi” gratis?

Ya — teks lengkap “Pertukaran antara throughput dan latensi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Pertukaran antara throughput dan latensi”?

Seimbangkan total pekerjaan per detik (throughput) dengan waktu per item (latensi): bandingkan pemrosesan per item, pemrosesan berkelompok, dan penyetelan tingkat paralelisme. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 3.

Berapa lama pelajaran “Pertukaran antara throughput dan latensi” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Parallel.ForEach, PLINQ
  2. Produsen/konsumen dengan Channels (ikhtisar)
  3. Pertukaran antara throughput dan latensi
← Kembali ke C# Academy