X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=benchmarks%2Fbenchmarks-utils.js;h=64df58c87b4a3b1c671a73695ef5905cd195c6df;hb=fbc22127e53d3ec0ecbd38ecea25fb92ebef50e7;hp=c04162e1a617d704708b56496040640947e22171;hpb=548140e67db5a4d10e7712fc0830c196a3f81968;p=poolifier.git diff --git a/benchmarks/benchmarks-utils.js b/benchmarks/benchmarks-utils.js index c04162e1..64df58c8 100644 --- a/benchmarks/benchmarks-utils.js +++ b/benchmarks/benchmarks-utils.js @@ -1,14 +1,26 @@ -const { WorkerFunctions } = require('./benchmarks-types') +const crypto = require('crypto') +const fs = require('fs') +const { + PoolTypes, + WorkerFunctions, + WorkerTypes +} = require('./benchmarks-types') +const { + DynamicClusterPool, + DynamicThreadPool, + FixedClusterPool, + FixedThreadPool +} = require('../lib') -async function runPoolifierTest (pool, { tasks, workerData }) { +async function runTest (pool, { taskExecutions, workerData }) { return new Promise((resolve, reject) => { let executions = 0 - for (let i = 1; i <= tasks; i++) { + for (let i = 1; i <= taskExecutions; i++) { pool .execute(workerData) .then(() => { - executions++ - if (executions === tasks) { + ++executions + if (executions === taskExecutions) { return resolve({ ok: 1 }) } return null @@ -21,15 +33,6 @@ async function runPoolifierTest (pool, { tasks, workerData }) { }) } -function jsonIntegerSerialization (n) { - for (let i = 0; i < n; i++) { - const o = { - a: i - } - JSON.stringify(o) - } -} - function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { if (max < min || max < 0 || min < 0) { throw new RangeError('Invalid interval') @@ -42,6 +45,15 @@ function generateRandomInteger (max = Number.MAX_SAFE_INTEGER, min = 0) { return Math.floor(Math.random() * (max + 1)) } +function jsonIntegerSerialization (n) { + for (let i = 0; i < n; i++) { + const o = { + a: i + } + JSON.stringify(o) + } +} + /** * Intentionally inefficient implementation. * @@ -62,9 +74,29 @@ function fibonacci (n) { function factorial (n) { if (n === 0) { return 1 - } else { - return factorial(n - 1) * n } + return factorial(n - 1) * n +} + +function readWriteFiles ( + n, + baseDirectory = `/tmp/poolifier-benchmarks/${crypto.randomInt( + 281474976710655 + )}` +) { + if (fs.existsSync(baseDirectory) === true) { + fs.rmSync(baseDirectory, { recursive: true }) + } + fs.mkdirSync(baseDirectory, { recursive: true }) + for (let i = 0; i < n; i++) { + const filePath = `${baseDirectory}/${i}` + fs.writeFileSync(filePath, i.toString(), { + encoding: 'utf8', + flag: 'a' + }) + fs.readFileSync(filePath, 'utf8') + } + fs.rmSync(baseDirectory, { recursive: true }) } function executeWorkerFunction (data) { @@ -75,14 +107,57 @@ function executeWorkerFunction (data) { return fibonacci(data.taskSize || 1000) case WorkerFunctions.factorial: return factorial(data.taskSize || 1000) + case WorkerFunctions.readWriteFiles: + return readWriteFiles(data.taskSize || 1000) default: throw new Error('Unknown worker function') } } +function buildPool (poolType, poolSize, workerType, poolOptions) { + switch (poolType) { + case PoolTypes.FIXED: + switch (workerType) { + case WorkerTypes.THREAD: + return new FixedThreadPool( + poolSize, + './benchmarks/internal/thread-worker.js', + poolOptions + ) + case WorkerTypes.CLUSTER: + return new FixedClusterPool( + poolSize, + './benchmarks/internal/cluster-worker.js', + poolOptions + ) + } + break + case PoolTypes.DYNAMIC: + switch (workerType) { + case WorkerTypes.THREAD: + return new DynamicThreadPool( + poolSize / 2, + poolSize * 3, + './benchmarks/internal/thread-worker.js', + poolOptions + ) + case WorkerTypes.CLUSTER: + return new DynamicClusterPool( + poolSize / 2, + poolSize * 3, + './benchmarks/internal/cluster-worker.js', + poolOptions + ) + } + break + } +} + module.exports = { WorkerFunctions, + buildPool, executeWorkerFunction, generateRandomInteger, - runPoolifierTest + readWriteFiles, + runTest }