Ir para o conteúdo

Benchmark Notes — Java (lib-cross-runtime-bench-java)

Correções Aplicadas

1. Warmup — Piso Mínimo Alinhado (Problema 4)

Contexto: O warmup adaptativo podia declarar estabilidade após apenas 10-25 iterações. Embora o JVM HotSpot C1 compile rápido, o C2 (optimized) demora mais. Para consistência cross-runtime, o mesmo piso foi aplicado.

Correção (WarmupManager.java): - Adicionada constante MIN_WARMUP_BEFORE_STABILITY_CHECK = 50 - Verificação de CV% só inicia após 50 iterações mínimas - Garante que C1 já compilou e C2 está ativo para hot paths - Alinhado com C# e Node.js

2. CPU% — Normalização por Cores (Problema 4)

Sintoma: CPU% podia ultrapassar 100% em máquinas multi-core.

Correção (BenchmarkRunner.java): - Fórmula corrigida: cpuPercent = (cpuTotal) / (wallClockMs × processorCount) × 100 - Produz 0-100% (single-core equivalent) - Max clamping alterado para 100.0 - Consistente com C# e Node.js

Como o Warmup Está Implementado

Warmup Adaptativo (default)

  1. Executa a ação repetidamente com System.nanoTime()
  2. Após 50 iterações mínimas (MIN_WARMUP_BEFORE_STABILITY_CHECK), inicia verificação
  3. A cada 5 iterações, calcula CV% usando CoefficientOfVariationDetector
  4. Se CV% < target (default 5%) por N verificações consecutivas → Para
  5. Limpeza periódica de GC a cada 10 iterações (cleanState())
  6. Timeout via warmupTimeoutMs configurável

Warmup Fixo (adaptiveWarmup = false)

  • Executa exatamente warmupIterations vezes
  • Limpeza de GC a cada 20 iterações

Configurações por Preset

Preset WarmupIterations Timeout Target CV%
DEFAULT 100 3000ms 5%
FAST 10 1000ms 10%
HIGH_PRECISION 200 10000ms 2%

Como CPU% É Calculada

cpuPercent = (cpuUserDelta + cpuSystemDelta) / (wallClockMs × processorCount) × 100

Onde: - cpuUserDelta = OperatingSystemMXBean.getProcessCpuTime() (delta em ns → ms) - cpuSystemDelta = 0 (JVM não expõe system time separadamente via MXBean) - wallClockMs = System.nanoTime() delta convertido para ms - processorCount = Runtime.getRuntime().availableProcessors() - Resultado: 0-100% (normalizado para single-core equivalent)

Nota: A JVM expõe somente getProcessCpuTime() que inclui user+system combinados. cpuSystemDelta é reportado como 0 nas métricas, mas o total inclui ambos.

Como as Estatísticas São Agregadas

  1. Coleta: N medições via HighPrecisionTimer.getTimestamp() (nanosegundos)
  2. Filtragem de Outliers: IQR (default), MAD, ZScore, ou Grubbs
  3. Algoritmo de Welford: Cálculo numericamente estável de média e variância
  4. Variância amostral: Bessel correction (N-1 divisor)
  5. IC 95%: t-Student com df = N-1
  6. Detecção de Anomalias: Mann-Kendall test para drift, análise de GC e CPU
  7. GC Determinístico (P2-001): Classifica GC beans por nome (não por ordem), funciona com Parallel, G1GC, ZGC, Shenandoah

Métricas Exportadas

  • Mean, Median, StdDev, Min, Max (ns e ms)
  • CV% (Coefficient of Variation)
  • IC 95% (Confidence Interval)
  • Throughput (ops/sec)
  • Outliers removidos + método
  • Hardware Counters (ciclos, instruções, CPI/IPC se disponível)