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.