From 1e78b894136cfcaa8577093cf117da8f8b098860 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Fri, 29 Jul 2022 15:39:44 -0700 Subject: [PATCH] [Perf] Display results with 4 significant figures (#22742) - Fixes Azure/azure-sdk-tools#3554 --- sdk/test-utils/perf/src/managerProgram.ts | 16 ++++---------- sdk/test-utils/perf/src/utils.ts | 27 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/sdk/test-utils/perf/src/managerProgram.ts b/sdk/test-utils/perf/src/managerProgram.ts index a00186f66751..8b1a06f0c49e 100644 --- a/sdk/test-utils/perf/src/managerProgram.ts +++ b/sdk/test-utils/perf/src/managerProgram.ts @@ -11,7 +11,7 @@ import { DefaultPerfOptions, ParsedPerfOptions } from "./options"; import { Snapshot } from "./snapshot"; import { PerfTestBase, PerfTestConstructor } from "./perfTestBase"; import { PerfProgram } from "./program"; -import { formatDuration } from "./utils"; +import { formatDuration, formatNumber } from "./utils"; /** * The manager program which is responsible for spawning workers which run the actual perf test. @@ -96,17 +96,9 @@ export class ManagerPerfProgram implements PerfProgram { maximumFractionDigits: 0, })} ` + `operations in a weighted-average of ` + - `${weightedAverage.toLocaleString(undefined, { - maximumFractionDigits: 2, - minimumFractionDigits: 2, - })}s ` + - `(${operationsPerSecond.toLocaleString(undefined, { - maximumFractionDigits: 2, - })} ops/s, ` + - `${secondsPerOperation.toLocaleString(undefined, { - maximumFractionDigits: 3, - minimumFractionDigits: 3, - })} s/op)` + `${formatNumber(weightedAverage, 4)}s ` + + `(${formatNumber(operationsPerSecond, 4)} ops/s, ` + + `${formatNumber(secondsPerOperation, 4)} s/op)` ); } diff --git a/sdk/test-utils/perf/src/utils.ts b/sdk/test-utils/perf/src/utils.ts index 98d4271ae3b8..e915f7013167 100644 --- a/sdk/test-utils/perf/src/utils.ts +++ b/sdk/test-utils/perf/src/utils.ts @@ -100,3 +100,30 @@ export function formatDuration(durationMilliseconds: number): string { return `${minutes < 10 ? "0" : ""}${minutes}:${seconds < 10 ? "0" : ""}${seconds}`; } + +/** + * Formats a number with a minimum number of significant digits. + * Digits to the left of the decimal point are always significant. + * Examples: + * - formatNumber(0, 4) -> "0.000" + * - formatNumber(12345, 4) -> "12,345" + * - formatNumber(1.2345, 4) -> "1.235" + * - formatNumber(0.00012345, 4) -> "0.0001235" + */ +export function formatNumber(value: number, minSignificantDigits: number) { + // Special case since log(0) is undefined + if (value == 0) { + return value.toLocaleString(undefined, { + minimumSignificantDigits: minSignificantDigits, + maximumSignificantDigits: minSignificantDigits, + }); + } + + const log = Math.log10(Math.abs(value)); + const significantDigits = Math.max(Math.ceil(log), minSignificantDigits); + + return value.toLocaleString(undefined, { + minimumSignificantDigits: significantDigits, + maximumSignificantDigits: significantDigits, + }); +}