perf: add benchmark defaults to external pools benchmark
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 22 Sep 2023 12:43:15 +0000 (14:43 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 22 Sep 2023 12:43:15 +0000 (14:43 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
15 files changed:
benchmarks/versus-external-pools/bench.sh
benchmarks/versus-external-pools/dynamic-node-worker-threads-pool.mjs
benchmarks/versus-external-pools/dynamic-piscina.mjs
benchmarks/versus-external-pools/dynamic-poolifier.mjs
benchmarks/versus-external-pools/dynamic-tinypool.mjs
benchmarks/versus-external-pools/dynamic-worker-nodes.js
benchmarks/versus-external-pools/dynamic-workerpool.mjs
benchmarks/versus-external-pools/fixed-nanothreads.mjs
benchmarks/versus-external-pools/fixed-piscina.mjs
benchmarks/versus-external-pools/fixed-poolifier.mjs
benchmarks/versus-external-pools/fixed-tinypool.mjs
benchmarks/versus-external-pools/fixed-worker-nodes.js
benchmarks/versus-external-pools/fixed-workerpool.mjs
benchmarks/versus-external-pools/static-node-worker-threads-pool.mjs
benchmarks/versus-external-pools/utils.mjs

index 7d7e9651469252304dec4145adcb42c858f88bd6..eeefbe805e93067546013a2e06d7655df911661b 100755 (executable)
@@ -38,14 +38,14 @@ done
 taskType=${taskType:-'CPU_INTENSIVE'}
 taskSize=${taskSize:-5000}
 poolSize=${poolSize:-$(nproc --all)}
-iterations=${iterations:-100000}
+numIterations=${iterations:-100000}
 
-echo 'Running benchmarks with pool size:' ${poolSize}', number of iterations:' ${iterations}', task type:' ${taskType} 'and task size:' ${taskSize}
+echo 'Running benchmarks with pool size:' ${poolSize}', number of iterations:' ${numIterations}', task type:' ${taskType} 'and task size:' ${taskSize}
 export NODE_ENV=production
 export TASK_TYPE=${taskType}
 export TASK_SIZE=${taskSize}
 export POOL_SIZE=${poolSize}
-export NUM_ITERATIONS=${iterations}
+export NUM_ITERATIONS=${numIterations}
 case "$OSTYPE" in
   darwin*)
     caffeinate ./hyperfine_benchmarks.sh
index c4be1ee1c6d1a0ca312d1597c1d8e4a48406d5fd..7b7361d09f18b9113984557fcdc042c01d515552 100644 (file)
@@ -1,20 +1,21 @@
 import { DynamicPool } from 'node-worker-threads-pool'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 import functionToBench from './functions/function-to-bench.js'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const dynamicPool = new DynamicPool(size)
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(
       dynamicPool.exec({
         task: functionToBench,
index 06c71779b4396379b47ffc912a5796862af586dc..4567714ecf72338fc3ba65f5bdf9741c65db791d 100644 (file)
@@ -1,12 +1,13 @@
 import Piscina from 'piscina'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const piscina = new Piscina({
@@ -18,7 +19,7 @@ const piscina = new Piscina({
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(piscina.run(data))
   }
   await Promise.all(promises)
index 98d210062d76a354cdec859486a49bcc0290e0eb..0251de2f20a57db365abe8f597bdd7e19c872e6c 100644 (file)
@@ -1,12 +1,13 @@
 import { DynamicThreadPool } from 'poolifier'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const dynamicThreadPool = new DynamicThreadPool(
@@ -20,7 +21,7 @@ const dynamicThreadPool = new DynamicThreadPool(
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(dynamicThreadPool.execute(data))
   }
   await Promise.all(promises)
index 3c00b134c50d95dbcc921d668556cb3137578955..9043d1a0597b2f7bcc8829cfe523daa0122aca8a 100644 (file)
@@ -1,12 +1,13 @@
 import Tinypool from 'tinypool'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const tinypool = new Tinypool({
@@ -18,7 +19,7 @@ const tinypool = new Tinypool({
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(tinypool.run(data))
   }
   await Promise.all(promises)
index c85a5f592d54d43a5759d8d0126f28b1994d7884..a67adb7fc267ec35d0261dca9caa6b27175e9eb0 100644 (file)
@@ -1,12 +1,14 @@
 'use strict'
 const WorkerNodes = require('worker-nodes')
+const { BenchmarkDefaults } = require('./utils.mjs')
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const workerNodes = new WorkerNodes(
@@ -20,7 +22,7 @@ const workerNodes = new WorkerNodes(
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(workerNodes.call.functionToBench(data))
   }
   await Promise.all(promises)
index f3baa446e97c9e161aa9db4b1f3abf5ca84cc392..bd68c0355243d28f575ee50574772c669f4317a6 100644 (file)
@@ -1,12 +1,13 @@
 import workerpool from 'workerpool'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const dataArray = [
   'MYBENCH',
-  process.env.TASK_TYPE,
-  parseInt(process.env.TASK_SIZE)
+  process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 ]
 
 const workerPool = workerpool.pool(
@@ -20,7 +21,7 @@ const workerPool = workerpool.pool(
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(workerPool.exec('functionToBench', dataArray))
   }
   await Promise.all(promises)
index d18f71b51d82e6c92a56c017a989c2487016864c..3b497af5ed9306223841ffe6b4ceb31a9e07f29e 100644 (file)
@@ -1,13 +1,14 @@
 import { ThreadPool } from 'nanothreads'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 import functionToBench from './functions/function-to-bench.js'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const threadPool = new ThreadPool({
@@ -17,7 +18,7 @@ const threadPool = new ThreadPool({
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(threadPool.exec(data))
   }
   await Promise.all(promises)
index 761586ac98e36efd9deed4a29be16a1dd602f452..ad9b938af8f4bbeee2e695ad00506aefc8c86998 100644 (file)
@@ -1,12 +1,13 @@
 import Piscina from 'piscina'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const piscina = new Piscina({
@@ -18,7 +19,7 @@ const piscina = new Piscina({
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(piscina.run(data))
   }
   await Promise.all(promises)
index 5efd786e562d1d6acabe2ad2981ccd2754fbe42e..a25b7fe40accdf75af86f9c02f22d2c4ea928a25 100644 (file)
@@ -1,12 +1,13 @@
 import { FixedThreadPool } from 'poolifier'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const fixedThreadPool = new FixedThreadPool(
@@ -19,7 +20,7 @@ const fixedThreadPool = new FixedThreadPool(
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(fixedThreadPool.execute(data))
   }
   await Promise.all(promises)
index 307ac3b53de2ef01355dd2c3ab80b800da95c40d..5e41d40bfe7357e54da07cce454afb0c1380c282 100644 (file)
@@ -1,12 +1,13 @@
 import Tinypool from 'tinypool'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const tinypool = new Tinypool({
@@ -18,7 +19,7 @@ const tinypool = new Tinypool({
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(tinypool.run(data))
   }
   await Promise.all(promises)
index 7dfa79bdeb4fe00c3ea50c54f5eec34b1a70c481..9af2936b7c0af5f15a6d5830905b62f7e690a70d 100644 (file)
@@ -1,12 +1,14 @@
 'use strict'
 const WorkerNodes = require('worker-nodes')
+const { BenchmarkDefaults } = require('./utils.mjs')
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const workerNodes = new WorkerNodes(
@@ -20,7 +22,7 @@ const workerNodes = new WorkerNodes(
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(workerNodes.call.functionToBench(data))
   }
   await Promise.all(promises)
index 9e016331ed86cd7d6f8a308b87c8e6d0b28fc135..6ebc0d69b40ea24c994a4d427f97d73c86ae5f7f 100644 (file)
@@ -1,12 +1,13 @@
 import workerpool from 'workerpool'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const dataArray = [
   'MYBENCH',
-  process.env.TASK_TYPE,
-  parseInt(process.env.TASK_SIZE)
+  process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 ]
 
 const workerPool = workerpool.pool(
@@ -20,7 +21,7 @@ const workerPool = workerpool.pool(
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(workerPool.exec('functionToBench', dataArray))
   }
   await Promise.all(promises)
index db14b180e6633461542a96a1df9f6b270e32bf80..0868d26ce1bc0a3f80f65f1d0fc3ddd7b4259d64 100644 (file)
@@ -1,13 +1,14 @@
 import { StaticPool } from 'node-worker-threads-pool'
-import { executeAsyncFn } from './utils.mjs'
+import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
 import functionToBench from './functions/function-to-bench.js'
 
-const size = parseInt(process.env.POOL_SIZE)
-const iterations = parseInt(process.env.NUM_ITERATIONS)
+const size = parseInt(process.env.POOL_SIZE) || BenchmarkDefaults.poolSize
+const numIterations =
+  parseInt(process.env.NUM_ITERATIONS) || BenchmarkDefaults.numIterations
 const data = {
   test: 'MYBENCH',
-  taskType: process.env.TASK_TYPE,
-  taskSize: parseInt(process.env.TASK_SIZE)
+  taskType: process.env.TASK_TYPE || BenchmarkDefaults.taskType,
+  taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
 }
 
 const staticPool = new StaticPool({
@@ -17,7 +18,7 @@ const staticPool = new StaticPool({
 
 async function run () {
   const promises = new Set()
-  for (let i = 0; i < iterations; i++) {
+  for (let i = 0; i < numIterations; i++) {
     promises.add(staticPool.exec(data))
   }
   await Promise.all(promises)
index 3d26ea16ad923ad8ac062fbfe881426992d9fb5a..8d58ded7a87ae317dce22d2f02393eaaf463391f 100644 (file)
@@ -1,3 +1,5 @@
+import { availableParallelism } from 'poolifier'
+
 export const executeAsyncFn = async fn => {
   try {
     await fn()
@@ -7,3 +9,10 @@ export const executeAsyncFn = async fn => {
     process.exit(1)
   }
 }
+
+export const BenchmarkDefaults = {
+  poolSize: availableParallelism(),
+  numIterations: 100000,
+  taskType: 'CPU_INTENSIVE',
+  taskSize: 5000
+}