Ir para o conteúdo

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:

  1. StatisticalAnalysis.analyzeMeasurements(): Para n=1, retornava variance = NaN que se propagava para stdDev, CV%, e relativeMarginalError. Para mean=0, CV% e RME também eram NaN.

  2. BenchmarkResult constructor: Usava ?? (nullish coalescing) para defaults, que intercepta null/undefined mas não intercepta NaN. 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)

  1. Executa a ação repetidamente com process.hrtime.bigint() (nanosegundos)
  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. Suporta funções sync e async transparentemente
  6. Timeout via warmupTimeSeconds configurável

Warmup Fixo (adaptiveWarmup = false)

  • Executa exatamente warmupIterations vezes
  • 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

cpuPercent = (userMicros + systemMicros) / (elapsedMicros × cores) × 100

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

  1. Coleta: N medições via process.hrtime.bigint() (nanosegundos)
  2. Filtragem de Outliers: IQR (default), MAD, ZScore, ou None
  3. Fallback: se filtragem remove amostras demais (< 3), usa medições originais
  4. Cálculo Estatístico (StatisticalAnalysis.analyzeMeasurements):
  5. Mean, Median, Min, Max
  6. Variância amostral (Bessel correction, N-1)
  7. StdDev, CV%
  8. Q1, Q3, IQR (percentis)
  9. Standard Error of Mean
  10. IC 95% via t-Student (tabela por graus de liberdade)
  11. Relative Marginal Error
  12. Detecção de Anomalias: Mann-Kendall test para drift, análise de GC e CPU
  13. 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, SampleCount
  • Metrics.TimingData: Versão arredondada para inteiros
  • Metrics.Throughput: OpsPerSecond
  • Metrics.Quality: CvPercent, Interpretation (EXCELLENT/GOOD/FAIR/POOR)
  • Metrics.ConfidenceInterval: LowerNs, UpperNs, MarginOfErrorPercent
  • Metrics.Memory: RssBytes, HeapBytes, TotalBytes
  • Metrics.Cpu: UserTimeMs, SystemTimeMs, CpuUsagePercent
  • Metrics.Gc: Gen0/Gen1/Gen2 Collections
  • Metrics.AnomalyAnalysis: Drift, GC anomalies, CPU anomalies