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)¶
- Executa a ação repetidamente com
System.nanoTime() - Após 50 iterações mínimas (MIN_WARMUP_BEFORE_STABILITY_CHECK), inicia verificação
- A cada 5 iterações, calcula CV% usando
CoefficientOfVariationDetector - Se CV% < target (default 5%) por N verificações consecutivas → Para
- Limpeza periódica de GC a cada 10 iterações (
cleanState()) - Timeout via
warmupTimeoutMsconfigurável
Warmup Fixo (adaptiveWarmup = false)¶
- Executa exatamente
warmupIterationsvezes - 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¶
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¶
- Coleta: N medições via
HighPrecisionTimer.getTimestamp()(nanosegundos) - Filtragem de Outliers: IQR (default), MAD, ZScore, ou Grubbs
- Algoritmo de Welford: Cálculo numericamente estável de média e variância
- Variância amostral: Bessel correction (N-1 divisor)
- IC 95%: t-Student com df = N-1
- Detecção de Anomalias: Mann-Kendall test para drift, análise de GC e CPU
- 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)