İş hacmi ve gecikme ödünleşimleri
Saniyedeki toplam iş miktarı (iş hacmi) ile öge başına süreyi (gecikme) dengeleyin: öge başına işlemeyi, toplu işlemeyi ve paralellik derecesi ayarını karşılaştırın.
İş hacmi ve gecikme ödünleşimleri, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 3 dersten oluşur.
İş hacmi ve gecikme
Tanımlar:
- İş hacmi: saniyedeki öğe sayısı
- Gecikme: tek bir öğeyi tamamlama süresi
- Ödünleşim: toplu işleme ve daha yüksek paralellik iş hacmini artırabilir, ancak tek tek öğeleri geciktirebilir
Öğe başına işleme biçimi
Her öğeyi geldiği anda işleyin: öğe başına bekleme azdır, ancak ek yük her öğe için tekrarlanır.
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);
}
}
Toplu işleme biçimi
Toplu işleme, tekrarlanan ek yükü azaltır ve iş hacmini artırır; ancak ilk öğeler toplu iş dolana kadar bekler (daha yüksek gecikme).
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);
}
}
Paralelliği ayarlama
MaxDegreeOfParallelism değerini ayarlamak CPU'ya bağlı işlerde iş hacmini artırabilir; değer çok yüksek olursa bağlam değiştirmeleri nedeniyle performans düşebilir.
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);
}
}
}
Mikro toplu iş fikri
Mikro toplu işler her iki hedefi dengeleyebilir: öğe başına işleme göre daha iyi iş hacmi, büyük toplu işlere göre daha düşük gecikme.
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);
}
}
Ayarlama ipuçları
Ayarlama kılavuzu:
- Hem ms/öğe hem de öğe/sn değerlerini ölçün
- Önce mikro toplu işleri deneyin
- Paralelliği yavaşça artırın; CPU'yu ve bağlam değiştirmelerini izleyin
- Uzun beklemeleri ve bellek büyümesini önlemek için kuyrukları sınırlayın
İş hacmi ve gecikme ödünleşimi
Özet
Özet: Öğe başına işleme = düşük gecikme, daha düşük iş hacmi. Büyük toplu işler/yüksek DOP = daha yüksek iş hacmi, daha yüksek gecikme. Mikro toplu işler ve dikkatli DOP ayarı her ikisini dengelemeye yardımcı olur.
Sıkça Sorulan Sorular
“İş hacmi ve gecikme ödünleşimleri” dersi ücretsiz mi?
Evet — “İş hacmi ve gecikme ödünleşimleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 3 dersten oluşur.
“İş hacmi ve gecikme ödünleşimleri” dersinde ne öğreneceğim?
Saniyedeki toplam iş miktarı (iş hacmi) ile öge başına süreyi (gecikme) dengeleyin: öge başına işlemeyi, toplu işlemeyi ve paralellik derecesi ayarını karşılaştırın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 3. dersidir.
“İş hacmi ve gecikme ödünleşimleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Parallel.ForEach ve PLINQ
- Kanallarla üretici/tüketici (genel bakış)
- İş hacmi ve gecikme ödünleşimleri