versionVerdict

tcmts.cli.main.versionVerdict · #qecgdf5g · term · runs anywhere

How a version runs beside the one before it, if that's news: slower (its p95 half as long again, and 2ms more), failing more (5 points more of its calls, two at least), or faster (by as much). Each needs five calls or more.

import { shownMs } from "#codebase/tcmts/cli/main";

export function versionVerdict(
  before: { n: number; errors: number; p95: number },
  after: { n: number; errors: number; p95: number },
): { worse: boolean; said: string } | undefined {
  if (before.n < 5 || after.n < 5) return undefined;
  const said: string[] = [];
  let worse = false;
  const ratio = after.p95 / Math.max(before.p95, 0.001);
  if (ratio >= 1.5 && after.p95 - before.p95 >= 2) {
    worse = true;
    said.push(`p95 ${shownMs(before.p95)} → ${shownMs(after.p95)} (${ratio.toFixed(1)}× slower)`);
  } else if (ratio <= 1 / 1.5 && before.p95 - after.p95 >= 2)
    said.push(
      `p95 ${shownMs(before.p95)} → ${shownMs(after.p95)} (${(1 / ratio).toFixed(1)}× faster)`,
    );
  const rate = (s: { n: number; errors: number }) => s.errors / s.n;
  if (rate(after) - rate(before) >= 0.05 && after.errors >= 2) {
    worse = true;
    const pct = (r: number) => `${Math.round(r * 100)}%`;
    said.push(`errors ${pct(rate(before))} → ${pct(rate(after))}`);
  }
  return said.length ? { worse, said: said.join(", ") } : undefined;
}

uses

used by