perf: automatically cover most poolifier settings in benchmark
[poolifier.git] / benchmarks / internal / bench.mjs
1 import { add, complete, cycle, save, suite } from 'benny'
2 import {
3 WorkerChoiceStrategies,
4 availableParallelism
5 } from '../../lib/index.mjs'
6 import {
7 PoolTypes,
8 WorkerFunctions,
9 WorkerTypes
10 } from '../benchmarks-types.mjs'
11 import { buildPool, runTest } from '../benchmarks-utils.mjs'
12
13 const poolSize = availableParallelism()
14 const pools = []
15 for (const poolType of Object.values(PoolTypes)) {
16 for (const workerType of Object.values(WorkerTypes)) {
17 for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) {
18 for (const tasksQueue of [false, true]) {
19 const pool = buildPool(
20 workerType,
21 poolType,
22 poolSize,
23 tasksQueue
24 ? {
25 ...{
26 workerChoiceStrategy
27 },
28 ...{ enableTasksQueue: true }
29 }
30 : {
31 workerChoiceStrategy
32 }
33 )
34 pools.push([
35 `${poolType}:${workerType}:${workerChoiceStrategy}:${tasksQueue}`,
36 pool
37 ])
38 }
39 }
40 }
41 }
42 const taskExecutions = 1
43 const workerData = {
44 function: WorkerFunctions.jsonIntegerSerialization,
45 taskSize: 1000
46 }
47
48 const addPools = pools =>
49 pools.map(([name, pool]) => {
50 return add(name, async () => {
51 await runTest(pool, {
52 taskExecutions,
53 workerData
54 })
55 })
56 })
57
58 const resultsFile = 'poolifier'
59 const resultsFolder = 'benchmarks/internal/results'
60
61 suite(
62 'Poolifier',
63 ...addPools(pools),
64 cycle(),
65 complete(),
66 save({
67 file: resultsFile,
68 folder: resultsFolder,
69 format: 'json',
70 details: true
71 }),
72 save({
73 file: resultsFile,
74 folder: resultsFolder,
75 format: 'chart.html',
76 details: true
77 }),
78 save({
79 file: resultsFile,
80 folder: resultsFolder,
81 format: 'table.html',
82 details: true
83 })
84 )
85 .then(() => {
86 // eslint-disable-next-line n/no-process-exit
87 return process.exit()
88 })
89 .catch(err => console.error(err))