Benchmark Notes — Node.js (lib-cross-runtime-bench-node)¶
Correções Aplicadas¶
1. Estatísticas Agregadas NaN (ALTO — Problema 3)¶
Sintoma: Campos er_meanNs, er_medianNs, er_stdDevNs, er_cvPercent eram todos NaN no JSON de saída. Somente latency_ms_measured individual estava disponível.
Causa raiz: Duas fontes de NaN:
-
StatisticalAnalysis.analyzeMeasurements(): Para n=1, retornavavariance = NaNque se propagava para stdDev, CV%, e relativeMarginalError. Para mean=0, CV% e RME também eram NaN. -
BenchmarkResultconstructor: Usava??(nullish coalescing) para defaults, que interceptanull/undefinedmas não interceptaNaN. Valores NaN passavam direto para o JSON exportado.
Correção (StatisticalAnalysis.js):
- variance para n≤1 agora retorna 0 em vez de NaN (alinhado com C#/Java)
- coefficientOfVariation para mean=0 retorna 0 em vez de NaN
- relativeMarginalError para mean=0 retorna 0 em vez de NaN
Correção (BenchmarkResult.js):
- Adicionada função safeNum(v, fallback) que verifica typeof number, !isNaN, e isFinite
- Todos os campos numéricos do constructor usam safeNum() em vez de ??
- Garante que o JSON exportado nunca contém NaN/Infinity
Correção (BenchmarkRunner.js):
- Adicionado fallback para quando outlier filtering remove amostras demais (< 3 restantes)
- Se filtragem produz < 3 samples, usa medições originais sem filtrar
- Aplicado tanto no path run() (async) quanto runSync()
2. Warmup — Piso Mínimo Alinhado (Problema 4)¶
Correção (WarmupManager.js):
- Adicionada constante MIN_WARMUP_BEFORE_STABILITY_CHECK = 50
- Verificação de CV% só inicia após 50 iterações mínimas
- V8 TurboFan precisa de ~100+ invocações para compilar código otimizado
- Aplicado em executeAdaptiveWarmup() e executeWarmupSync()
- Alinhado com C# e Java
Como o Warmup Está Implementado¶
Warmup Adaptativo (default)¶
- Executa a ação repetidamente com
process.hrtime.bigint()(nanosegundos) - 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
- Suporta funções sync e async transparentemente
- Timeout via
warmupTimeSecondsconfigurável
Warmup Fixo (adaptiveWarmup = false)¶
- Executa exatamente
warmupIterationsvezes - Retorna CV% final para diagnóstico
Configurações por Preset¶
| Preset | WarmupIterations | WarmupTimeSeconds | Target CV% |
|---|---|---|---|
| DEFAULT | 100 | 3.0s | 5% |
| FAST | 10 | 1.0s | 10% |
| HIGH_PRECISION | 200 | 10.0s | 2% |
Como CPU% É Calculada¶
Onde:
- userMicros e systemMicros = process.cpuUsage() (resolução em microsegundos)
- elapsedMicros = process.hrtime.bigint() delta convertido
- cores = os.cpus().length
- Resultado: 0-100% (normalizado para single-core equivalent)
Implementação: CpuMetricsCollector._calculateCpuPercent() já normalizava por cores. Consistente com C# e Java após as correções.
Como as Estatísticas São Agregadas¶
- Coleta: N medições via
process.hrtime.bigint()(nanosegundos) - Filtragem de Outliers: IQR (default), MAD, ZScore, ou None
- Fallback: se filtragem remove amostras demais (< 3), usa medições originais
- Cálculo Estatístico (
StatisticalAnalysis.analyzeMeasurements): - Mean, Median, Min, Max
- Variância amostral (Bessel correction, N-1)
- StdDev, CV%
- Q1, Q3, IQR (percentis)
- Standard Error of Mean
- IC 95% via t-Student (tabela por graus de liberdade)
- Relative Marginal Error
- Detecção de Anomalias: Mann-Kendall test para drift, análise de GC e CPU
- Guard NaN:
safeNum()no BenchmarkResult garante zero NaN no output
Métricas Exportadas (JSON — PascalCase para paridade com C#)¶
Metrics.Timing: MeanNs, MedianNs, StddevNs, MinNs, MaxNs, CvPercent, SampleCountMetrics.TimingData: Versão arredondada para inteirosMetrics.Throughput: OpsPerSecondMetrics.Quality: CvPercent, Interpretation (EXCELLENT/GOOD/FAIR/POOR)Metrics.ConfidenceInterval: LowerNs, UpperNs, MarginOfErrorPercentMetrics.Memory: RssBytes, HeapBytes, TotalBytesMetrics.Cpu: UserTimeMs, SystemTimeMs, CpuUsagePercentMetrics.Gc: Gen0/Gen1/Gen2 CollectionsMetrics.AnomalyAnalysis: Drift, GC anomalies, CPU anomalies