perf: workaround issue with cluster module and ESM
[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 WorkerTypes = Object.freeze({
14 thread: 'thread'
15 })
16
17 const poolSize = availableParallelism()
18 const pools = []
19 for (const poolType of Object.values(PoolTypes)) {
20 for (const workerType of Object.values(WorkerTypes)) {
21 for (const workerChoiceStrategy of Object.values(WorkerChoiceStrategies)) {
22 for (const tasksQueue of [false, true]) {
23 const pool = buildPool(
24 workerType,
25 poolType,
26 poolSize,
27 tasksQueue
28 ? {
29 ...{
30 workerChoiceStrategy
31 },
32 ...{ enableTasksQueue: true }
33 }
34 : {
35 workerChoiceStrategy
36 }
37 )
38 pools.push([
39 `${poolType}|${workerType}|${workerChoiceStrategy}|tasks queue:${tasksQueue}`,
40 pool
41 ])
42 }
43 }
44 }
45 }
46
47 const taskExecutions = 1
48 const workerData = {
49 function: WorkerFunctions.jsonIntegerSerialization,
50 taskSize: 1000
51 }
52 const addPools = pools =>
53 pools.map(([name, pool]) => {
54 return add(name, async () => {
55 await runTest(pool, {
56 taskExecutions,
57 workerData
58 })
59 })
60 })
61
62 const resultsFile = 'poolifier'
63 const resultsFolder = 'benchmarks/internal/results'
64 suite(
65 'Poolifier',
66 ...addPools(pools),
67 cycle(),
68 complete(),
69 save({
70 file: resultsFile,
71 folder: resultsFolder,
72 format: 'json',
73 details: true
74 }),
75 save({
76 file: resultsFile,
77 folder: resultsFolder,
78 format: 'chart.html',
79 details: true
80 }),
81 save({
82 file: resultsFile,
83 folder: resultsFolder,
84 format: 'table.html',
85 details: true
86 })
87 )
88 .then(() => {
89 // eslint-disable-next-line n/no-process-exit
90 return process.exit()
91 })
92 .catch(err => console.error(err))