Perguntas de Entrevista sobre Performance em Zig

Perguntas de Entrevista sobre Performance em Zig

Performance é a razão principal pela qual empresas escolhem Zig. Entrevistas para posições que envolvem Zig frequentemente incluem perguntas profundas sobre otimização, profiling e técnicas de alta performance. Estas perguntas são especialmente relevantes para vagas em fintech, infraestrutura e gaming.

Fundamentos

Por que Zig é eficiente em termos de performance?

  • Sem GC: Não há pausas de garbage collection. Gerenciamento de memória é explícito via allocators.
  • Sem runtime: O binário é código puro — sem interpretador, JIT ou VM.
  • Sem alocações ocultas: Você sabe exatamente quando e onde memória é alocada.
  • Compilação nativa via LLVM: Acesso a todas as otimizações do LLVM.
  • Controle de layout de memória: Packed structs, align, controle de padding.
  • SIMD nativo: Vetores SIMD são tipos de primeira classe.

Explique o conceito de cache-friendly programming.

CPUs modernas acessam memória principal em blocos (cache lines, tipicamente 64 bytes). Código cache-friendly organiza dados para maximizar cache hits:

Array of Structs (AoS) vs Struct of Arrays (SoA):

// AoS — ruim para cache se só acessa position
const EntityAoS = struct { position: Vec3, velocity: Vec3, health: f32 };
var entities_aos: [1000]EntityAoS = undefined;

// SoA — bom para cache quando acessa apenas positions
const EntitiesSoA = struct {
    positions: [1000]Vec3,
    velocities: [1000]Vec3,
    healths: [1000]f32,
};

SoA é comum em game engines e processamento de dados, onde frequentemente iteramos sobre um único campo de todos os elementos.

O que é zero-copy e como Zig facilita?

Zero-copy significa processar dados sem copiá-los — operando diretamente nos buffers originais. Zig facilita com slices:

fn processarMensagem(buffer: []const u8) !Mensagem {
    // Slice do buffer original — sem cópia
    const header = buffer[0..8];
    const payload = buffer[8..];
    return Mensagem{ .header = header, .payload = payload };
}

Isso é crítico em networking de alta performance e processamento de dados.

Perguntas Avançadas

Como usar SIMD em Zig?

Zig tem suporte nativo a vetores SIMD:

const Vec4f = @Vector(4, f32);

fn somar(a: Vec4f, b: Vec4f) Vec4f {
    return a + b; // operação SIMD — 4 somas em uma instrução
}

O compilador pode também auto-vetorizar loops simples quando otimizações estão ativas.

Quais ferramentas de profiling são usadas com Zig?

  • perf (Linux): Profiling de CPU, cache misses, branch prediction
  • Valgrind/Callgrind: Profiling de chamadas e memória
  • Tracy: Profiler de frames para game dev
  • Ferramentas do ecossistema: Ferramentas específicas para Zig
  • std.time.Timer: Timing manual para microbenchmarks

Como reduzir branch mispredictions?

  • Organizar dados para que branches sejam previsíveis
  • Usar lookup tables em vez de cascatas de if/else
  • Branchless programming com operações condicionais
  • Profile-guided optimization (PGO)

Preparação

Combine com perguntas de memória (alocação afeta performance), concorrência (paralelismo para throughput) e desafios de código. Explore ferramentas de profiling do ecossistema e veja cases de produção para contexto real.

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.