Compromissos entre vazão e latência
Equilibre o trabalho total por segundo (vazão) com o tempo por item (latência): compare o processamento por item, o processamento em lotes e o ajuste do grau de paralelismo.
Compromissos entre vazão e latência é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 3 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.
Vazão versus latência
Definições:
- Vazão: itens por segundo
- Latência: tempo para concluir um item
- Compromisso: o processamento em lotes e um paralelismo maior podem aumentar a vazão, mas atrasar itens individuais
Estilo por item
Processe cada item assim que ele chegar: espera mínima por item, mas a sobrecarga se repete para todos os itens.
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);
}
}
Estilo em lotes
O processamento em lotes reduz a sobrecarga repetida e aumenta a vazão, mas os primeiros itens esperam o lote ser preenchido, o que eleva a latência.
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);
}
}
Ajuste do paralelismo
Ajustar MaxDegreeOfParallelism pode aumentar a vazão em trabalhos limitados pela CPU; um valor alto demais pode prejudicar o desempenho devido às trocas de contexto.
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);
}
}
}
Ideia de microlotes
Os microlotes podem equilibrar os dois objetivos: oferecem uma vazão melhor que o processamento por item e uma latência menor que a de lotes enormes.
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);
}
}
Dicas de ajuste
Guia de ajuste:
- Meça tanto os milissegundos por item quanto os itens por segundo
- Experimente primeiro os microlotes
- Aumente o paralelismo lentamente; observe a CPU e as trocas de contexto
- Limite as filas para evitar esperas longas e crescimento da memória
Compromisso entre vazão e latência
Resumo
Resumo: Por item = baixa latência, menor vazão. Lotes grandes ou DOP alto = maior vazão, maior latência. Microlotes e um ajuste cuidadoso do DOP ajudam a equilibrar os dois aspectos.
Perguntas Frequentes
A aula “Compromissos entre vazão e latência” é grátis?
Sim — o texto completo de “Compromissos entre vazão e latência” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.
O que vou aprender em “Compromissos entre vazão e latência”?
Equilibre o trabalho total por segundo (vazão) com o tempo por item (latência): compare o processamento por item, o processamento em lotes e o ajuste do grau de paralelismo. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 3.
Quanto tempo leva a aula “Compromissos entre vazão e latência”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Parallel.ForEach, PLINQ
- Produtor/consumidor com Channels (visão geral)
- Compromissos entre vazão e latência