From a7fe92097e93034e0d31aea2dbb26bd34ce4a30e Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Thu, 21 Jan 2021 14:53:49 -0800 Subject: [PATCH 1/8] Add perfstress to test-utils/ci.yml --- sdk/test-utils/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/test-utils/ci.yml b/sdk/test-utils/ci.yml index 7a5c42e1d8f1..b359ea8de056 100644 --- a/sdk/test-utils/ci.yml +++ b/sdk/test-utils/ci.yml @@ -29,3 +29,5 @@ extends: Artifacts: - name: azure-test-utils-recorder safeName: azuretestutilsrecorder + - name: azure-test-utils-perfstress + safeName: azuretestutilsperfstress From aa55ede7475a03e48252e201559d33a151bec13a Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Thu, 21 Jan 2021 16:01:35 -0800 Subject: [PATCH 2/8] Revert "Add perfstress to test-utils/ci.yml" This reverts commit a7fe92097e93034e0d31aea2dbb26bd34ce4a30e. --- sdk/test-utils/ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdk/test-utils/ci.yml b/sdk/test-utils/ci.yml index b359ea8de056..7a5c42e1d8f1 100644 --- a/sdk/test-utils/ci.yml +++ b/sdk/test-utils/ci.yml @@ -29,5 +29,3 @@ extends: Artifacts: - name: azure-test-utils-recorder safeName: azuretestutilsrecorder - - name: azure-test-utils-perfstress - safeName: azuretestutilsperfstress From e61d62b8b9b0694740662359e5f66369ef146007 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Thu, 21 Jan 2021 16:02:50 -0800 Subject: [PATCH 3/8] Mark test-utils-perfstress as sdk-type:client - Ensures project is built in test-utils pipeline --- sdk/test-utils/perfstress/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/test-utils/perfstress/package.json b/sdk/test-utils/perfstress/package.json index df2ee292c8ef..760dca44ba34 100644 --- a/sdk/test-utils/perfstress/package.json +++ b/sdk/test-utils/perfstress/package.json @@ -1,6 +1,7 @@ { "name": "@azure/test-utils-perfstress", "version": "1.0.0", + "sdk-type": "client", "description": "Performance and stress test framework for the Azure SDK for JavaScript and TypeScript", "main": "dist-esm/src/index.js", "module": "dist-esm/src/index.js", From a005b3de30c228525c114bf346d1a93d7a5bd91d Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Thu, 21 Jan 2021 16:29:38 -0800 Subject: [PATCH 4/8] Extract method getCompletedOperations() --- sdk/test-utils/perfstress/src/program.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sdk/test-utils/perfstress/src/program.ts b/sdk/test-utils/perfstress/src/program.ts index 8667c126b3e0..de6b2a2c8199 100644 --- a/sdk/test-utils/perfstress/src/program.ts +++ b/sdk/test-utils/perfstress/src/program.ts @@ -61,6 +61,10 @@ export class PerfStressProgram { } } + private getCompletedOperations(parallels: PerfStressParallel[]): number { + return parallels.reduce((sum, i) => sum + i.completedOperations, 0); + } + /** * Does some calculations based on the parallel executions provided, * then logs them in a friendly way. @@ -82,7 +86,7 @@ export class PerfStressProgram { * @param parallels Parallel executions */ private logResults(parallels: PerfStressParallel[]): void { - const totalOperations = parallels.reduce((sum, i) => sum + i.completedOperations, 0); + const totalOperations = this.getCompletedOperations(parallels); const operationsPerSecond = parallels.reduce((sum, parallel) => { return sum + parallel.completedOperations / (parallel.lastMillisecondsElapsed / 1000); }, 0); @@ -207,7 +211,7 @@ export class PerfStressProgram { console.log(`Since Last Log\t\tTotal`); let lastInIteration = 0; const logInterval = setInterval(() => { - const inTotal = parallels.reduce((sum, i) => sum + i.completedOperations, 0); + const inTotal = this.getCompletedOperations(parallels); const sinceLastLog = inTotal - lastInIteration; console.log(sinceLastLog + "\t\t\t" + inTotal); lastInIteration = inTotal; From e834862ff0d579e6431484b064e0febc86e62f4e Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Thu, 21 Jan 2021 18:40:39 -0800 Subject: [PATCH 5/8] [Perf] Include running average in per-second output --- sdk/test-utils/perfstress/src/program.ts | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/sdk/test-utils/perfstress/src/program.ts b/sdk/test-utils/perfstress/src/program.ts index de6b2a2c8199..bde832832849 100644 --- a/sdk/test-utils/perfstress/src/program.ts +++ b/sdk/test-utils/perfstress/src/program.ts @@ -65,6 +65,12 @@ export class PerfStressProgram { return parallels.reduce((sum, i) => sum + i.completedOperations, 0); } + private getOperationsPerSecond(parallels: PerfStressParallel[]): number { + return parallels.reduce((sum, parallel) => { + return sum + parallel.completedOperations / (parallel.lastMillisecondsElapsed / 1000); + }, 0); + } + /** * Does some calculations based on the parallel executions provided, * then logs them in a friendly way. @@ -87,9 +93,7 @@ export class PerfStressProgram { */ private logResults(parallels: PerfStressParallel[]): void { const totalOperations = this.getCompletedOperations(parallels); - const operationsPerSecond = parallels.reduce((sum, parallel) => { - return sum + parallel.completedOperations / (parallel.lastMillisecondsElapsed / 1000); - }, 0); + const operationsPerSecond = this.getOperationsPerSecond(parallels); const secondsPerOperation = 1 / operationsPerSecond; const weightedAverage = totalOperations / operationsPerSecond; console.log( @@ -208,13 +212,15 @@ export class PerfStressProgram { `\n=== ${title} mode, iteration ${iterationIndex}. Logs every ${millisecondsToLog / 1000}s ===` ); - console.log(`Since Last Log\t\tTotal`); - let lastInIteration = 0; + console.log(`Current\t\tTotal\t\tAverage`); + let lastCompleted = 0; const logInterval = setInterval(() => { - const inTotal = this.getCompletedOperations(parallels); - const sinceLastLog = inTotal - lastInIteration; - console.log(sinceLastLog + "\t\t\t" + inTotal); - lastInIteration = inTotal; + const totalCompleted = this.getCompletedOperations(parallels); + const currentCompleted = totalCompleted - lastCompleted; + const averageCompleted = this.getOperationsPerSecond(parallels); + + lastCompleted = totalCompleted; + console.log(`${totalCompleted}\t\t${currentCompleted}\t\t${averageCompleted.toFixed(2)}`); }, millisecondsToLog); const isAsync = !this.parsedDefaultOptions.sync.value; From 595a0c2efea179ce8c50ded881966a78a1e498a7 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Thu, 21 Jan 2021 20:27:01 -0800 Subject: [PATCH 6/8] Improve output number formatting --- sdk/test-utils/perfstress/src/program.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sdk/test-utils/perfstress/src/program.ts b/sdk/test-utils/perfstress/src/program.ts index bde832832849..6369b16ecabc 100644 --- a/sdk/test-utils/perfstress/src/program.ts +++ b/sdk/test-utils/perfstress/src/program.ts @@ -97,9 +97,11 @@ export class PerfStressProgram { const secondsPerOperation = 1 / operationsPerSecond; const weightedAverage = totalOperations / operationsPerSecond; console.log( - `Completed ${totalOperations} operations in a weighted-average of ${weightedAverage.toFixed( - 2 - )}s` + ` (${operationsPerSecond.toFixed(2)} ops/s, ${secondsPerOperation.toFixed(3)} s/op)` + `Completed ${totalOperations.toLocaleString(undefined, { 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)` ); } From 24aabc89fd12673be9d5c354941deacd010df25b Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Thu, 21 Jan 2021 20:28:03 -0800 Subject: [PATCH 7/8] Improve number formatting --- sdk/test-utils/perfstress/src/program.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/sdk/test-utils/perfstress/src/program.ts b/sdk/test-utils/perfstress/src/program.ts index 6369b16ecabc..e5fb39592a72 100644 --- a/sdk/test-utils/perfstress/src/program.ts +++ b/sdk/test-utils/perfstress/src/program.ts @@ -97,11 +97,17 @@ export class PerfStressProgram { const secondsPerOperation = 1 / operationsPerSecond; const weightedAverage = totalOperations / operationsPerSecond; console.log( - `Completed ${totalOperations.toLocaleString(undefined, { 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)` + `Completed ${totalOperations.toLocaleString(undefined, { 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)` ); } From aa73eace67121ec81cba47bccf43bf78e604e249 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Mon, 8 Feb 2021 17:54:31 -0800 Subject: [PATCH 8/8] Fix order of "current" and "total" running logs --- sdk/test-utils/perfstress/src/program.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/test-utils/perfstress/src/program.ts b/sdk/test-utils/perfstress/src/program.ts index e5fb39592a72..d8fdd9edef08 100644 --- a/sdk/test-utils/perfstress/src/program.ts +++ b/sdk/test-utils/perfstress/src/program.ts @@ -228,7 +228,7 @@ export class PerfStressProgram { const averageCompleted = this.getOperationsPerSecond(parallels); lastCompleted = totalCompleted; - console.log(`${totalCompleted}\t\t${currentCompleted}\t\t${averageCompleted.toFixed(2)}`); + console.log(`${currentCompleted}\t\t${totalCompleted}\t\t${averageCompleted.toFixed(2)}`); }, millisecondsToLog); const isAsync = !this.parsedDefaultOptions.sync.value;