0Pricing
C# Academy · Aula

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

Verificação rápida: Qual alteração normalmente melhora a vazão, mas pode aumentar a latência por item?

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

  1. Parallel.ForEach, PLINQ
  2. Produtor/consumidor com Channels (visão geral)
  3. Compromissos entre vazão e latência
← Voltar para C# Academy