'jsdoc/require-jsdoc': 'off'
}
},
- {
- files: ['benchmarks/versus-external-pools/**/*.js'],
- rules: {
- 'n/no-missing-require': 'off'
- }
- },
- {
- files: ['benchmarks/versus-external-pools/**/*.mjs'],
- rules: {
- 'n/no-missing-import': 'off',
- 'import/no-unresolved': 'off'
- }
- },
{
files: ['examples/javascript/**/*.js'],
rules: {
- 'pioardi'
- 'jerome-benoit'
versioning-strategy: increase
- - package-ecosystem: 'npm'
- directory: '/benchmarks/versus-external-pools'
- schedule:
- interval: 'daily'
- labels:
- - 'dependencies'
- - 'benchmarks'
- reviewers:
- - 'pioardi'
- - 'jerome-benoit'
- versioning-strategy: increase
- package-ecosystem: 'npm'
directory: '/examples/typescript/http-client-pool'
schedule:
+++ /dev/null
-name: External benchmark
-
-on:
- workflow_dispatch:
- schedule:
- - cron: '0 3 * * *'
-
-jobs:
- external-benchmark:
- if: github.repository == 'poolifier/poolifier'
- runs-on: [self-hosted, external-benchmark]
- defaults:
- run:
- working-directory: benchmarks/versus-external-pools
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: Setup pnpm
- uses: pnpm/action-setup@v2
- with:
- version: 8
- - name: Setup Node.js
- uses: actions/setup-node@v3
- with:
- node-version: '18.x'
- cache: 'pnpm'
- - name: Install dependencies
- run: pnpm install --ignore-scripts
- - name: Run benchmark
- uses: blacha/hyperfine-action@v1
- with:
- benchmark-config: '.hyperfine.json'
- count: 500
- benchmark-branch: 'gh-pages'
- benchmark-output: './benchmarks.json'
- benchmark-html: './benchmarks.html'
- master-branch: 'master'
- github-token: ${{ secrets.GITHUB_TOKEN }}
- # - name: Run benchmark
- # if: github.ref == 'refs/heads/${{ github.event.repository.default_branch }}'
- # run: ./bench.sh
- # - name: Commit files
- # if: github.ref == 'refs/heads/${{ github.event.repository.default_branch }}'
- # env:
- # COMMIT_MESSAGE: 'docs: update benchmark versus external pools results'
- # COMMIT_AUTHOR: Benchmark Bot
- # COMMIT_EMAIL: benchmark-bot@users.noreply.github.com
- # run: |
- # git config --local user.name "${{ env.COMMIT_AUTHOR }}"
- # git config --local user.email "${{ env.COMMIT_EMAIL }}"
- # git pull
- # git add ./BENCH-100000.md ./BENCH-100000.json
- # git commit -a -m "${{ env.COMMIT_MESSAGE }}"
- # - name: Push changes
- # if: github.ref == 'refs/heads/${{ github.event.repository.default_branch }}'
- # uses: CasperWA/push-protected@v2
- # with:
- # token: ${{ secrets.GH_TOKEN_PROTECTED }}
- # branch: ${{ github.event.repository.default_branch }}
.nyc_output/
-benchmarks/versus-external-pools/BENCH-100000.*
coverage/
docs/**/*.css
docs/**/*.html
-# Poolifier Benchmarks
+# Poolifier benchmarks
Welcome to poolifier benchmarks and thanks to look into this project.
## Folder Structure
-The [internal](./internal) folder contains poolifier internal benchmark.
-The [versus-external-pools](./versus-external-pools) folder contains benchmark versus other Node.js pools.
+The [internal](./internal) folder contains poolifier internal benchmark.
-## Poolifier vs other pools benchmark
+## Poolifier benchmark versus other worker pools
To compare poolifier pools performance vs other pools performance we chose to use [hyperfine](https://github.com/sharkdp/hyperfine).
We chose to use this tool because it allows to run isolated Node.js processes so each pool does not impact each other.
Those are our results:
- - CPU Intensive task with 100k operations submitted to each pool: [BENCH-100000.md](./versus-external-pools/BENCH-100000.md).
+ - CPU Intensive task with 100k operations submitted to each pool: [BENCH-100000.md](https://github.com/poolifier/benchmark/BENCH-100000.md).
- External pools with which we used to compare the poolifier results:
> :warning: **We would need funds to run our benchmark more often and on Cloud VMs, please consider to sponsor this project**
-Read the [README.md](./versus-external-pools/README.md) to know how to run the benchmark.
+Read the [README.md](https://github.com/poolifier/benchmark#README.md) to know how to run the benchmark.
## Poolifier internal benchmark
+++ /dev/null
-[
- { "name": "Poolifier dynamic", "command": "node dynamic-poolifier.mjs" },
- { "name": "Poolifier fixed", "command": "node fixed-poolifier.mjs" },
- { "name": "Piscina dynamic", "command": "node dynamic-piscina.mjs" },
- { "name": "Piscina fixed", "command": "node fixed-piscina.mjs" },
- { "name": "Tinypool dynamic", "command": "node dynamic-tinypool.mjs" },
- { "name": "Tinypool fixed", "command": "node fixed-tinypool.mjs" },
- { "name": "Workerpool dynamic", "command": "node dynamic-workerpool.mjs" },
- { "name": "Workerpool fixed", "command": "node fixed-workerpool.mjs" },
- { "name": "Worker nodes dynamic", "command": "node dynamic-worker-nodes.js" },
- { "name": "Worker nodes fixed", "command": "node fixed-worker-nodes.js" },
- {
- "name": "Node worker threads pool dynamic",
- "command": "node dynamic-node-worker-threads-pool.mjs"
- },
- {
- "name": "Node worker threads pool static",
- "command": "node static-node-worker-threads-pool.mjs"
- },
- { "name": "Nanothreads fixed", "command": "node fixed-nanothreads.mjs" }
-]
+++ /dev/null
-{
- "results": [
- {
- "command": "node dynamic-poolifier.mjs",
- "mean": 11.55075054077,
- "stddev": 0.20784293767846143,
- "median": 11.54467570412,
- "user": 84.0660399,
- "system": 0.5622882199999999,
- "min": 11.208749281620001,
- "max": 12.25473233162,
- "times": [
- 11.49684047062,
- 11.56312437962,
- 11.208749281620001,
- 11.67328100762,
- 12.25473233162,
- 11.54428540062,
- 11.46021319862,
- 11.44752011262,
- 11.59018277462,
- 11.628013105620001,
- 11.44637723462,
- 11.649140772620001,
- 11.60700196362,
- 11.28643609162,
- 11.581596236620001,
- 11.545066007620001,
- 11.69568724462,
- 11.49889742162,
- 11.49206031562,
- 11.34580546362
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node fixed-poolifier.mjs",
- "mean": 11.613179987920002,
- "stddev": 0.26505522925356295,
- "median": 11.55083026362,
- "user": 84.7942242,
- "system": 0.55555797,
- "min": 11.29344093662,
- "max": 12.12779164362,
- "times": [
- 12.00907242062,
- 11.36196327262,
- 11.53659212462,
- 11.59175335362,
- 11.63676922962,
- 11.51177642162,
- 11.56506840262,
- 11.375838938620001,
- 12.06459027962,
- 11.67329544262,
- 11.430171919620001,
- 12.00614824362,
- 11.44961893662,
- 11.32179300862,
- 11.29344093662,
- 11.64870515262,
- 11.31450366462,
- 12.12779164362,
- 11.85632421162,
- 11.48838215462
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node dynamic-piscina.mjs",
- "mean": 13.973407722470004,
- "stddev": 0.12606064145604856,
- "median": 13.96243489162,
- "user": 83.8592749,
- "system": 0.8513755699999999,
- "min": 13.818597114620001,
- "max": 14.19692715462,
- "times": [
- 14.06185216562,
- 13.92105195962,
- 14.06125208562,
- 13.818597114620001,
- 13.847389768620001,
- 14.04154631562,
- 13.83880104562,
- 13.83042812062,
- 14.19692715462,
- 13.835554932620001,
- 14.07950664062,
- 14.19050766862,
- 13.843402922620001,
- 13.889904660620001,
- 14.00672743562,
- 14.10822115462,
- 13.91654367762,
- 14.10098146662,
- 14.00381782362,
- 13.875140335620001
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node fixed-piscina.mjs",
- "mean": 14.053764739920002,
- "stddev": 0.23959786134968566,
- "median": 13.95764937112,
- "user": 84.02636405,
- "system": 0.87365207,
- "min": 13.85794257062,
- "max": 14.72543876362,
- "times": [
- 14.038924638620001,
- 14.05329965862,
- 13.93005735762,
- 14.523645955620001,
- 14.31483429462,
- 13.96267422562,
- 14.00971030162,
- 13.88331723162,
- 13.879136070620001,
- 13.92886326862,
- 13.947792811620001,
- 14.06202611762,
- 13.923721671620001,
- 13.85794257062,
- 14.36705413962,
- 13.86885786562,
- 13.86680788262,
- 13.97856545562,
- 13.95262451662,
- 14.72543876362
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node dynamic-tinypool.mjs",
- "mean": 14.192497767819997,
- "stddev": 0.19898661212872024,
- "median": 14.11589190162,
- "user": 84.1778193,
- "system": 1.7365379699999999,
- "min": 13.94773604262,
- "max": 14.80781905662,
- "times": [
- 14.20720532062,
- 14.04648268462,
- 14.104579256620001,
- 14.04690160262,
- 14.01935088262,
- 14.058559025620001,
- 13.94773604262,
- 14.094982635620001,
- 14.24299566062,
- 14.06452185362,
- 14.322297324620001,
- 14.12720454662,
- 14.80781905662,
- 14.46353298062,
- 14.22939591562,
- 14.28063325362,
- 14.37698363062,
- 14.08703260862,
- 14.02650351062,
- 14.29523756362
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node fixed-tinypool.mjs",
- "mean": 14.09691643987,
- "stddev": 0.1504750906527409,
- "median": 14.04235217862,
- "user": 84.05017995,
- "system": 1.7184885700000003,
- "min": 13.94850102362,
- "max": 14.62660283162,
- "times": [
- 14.04177983062,
- 14.08265744262,
- 14.04292452662,
- 14.04115693162,
- 14.62660283162,
- 14.20428710862,
- 14.03022654662,
- 14.10612761262,
- 13.97973396762,
- 14.15177939462,
- 14.11761993362,
- 14.024605341620001,
- 14.161442815620001,
- 14.02377354362,
- 13.989944769620001,
- 14.16264722262,
- 13.98007053662,
- 13.94850102362,
- 14.253614819620001,
- 13.96883259762
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node dynamic-workerpool.mjs",
- "mean": 14.67497597497,
- "stddev": 0.1370350339095064,
- "median": 14.65934658912,
- "user": 86.53396505,
- "system": 1.2622574700000002,
- "min": 14.52780176562,
- "max": 15.14487437562,
- "times": [
- 14.66725246662,
- 14.799724129620001,
- 14.68276268462,
- 14.65987088462,
- 14.72250008262,
- 14.52780176562,
- 14.64081424762,
- 14.553551029620001,
- 14.54776240462,
- 14.558504302620001,
- 14.77122116262,
- 14.59935780662,
- 15.14487437562,
- 14.750654324620001,
- 14.591429702620001,
- 14.56554472262,
- 14.60317633562,
- 14.72992723562,
- 14.65882229362,
- 14.72396754162
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node fixed-workerpool.mjs",
- "mean": 14.69457236522,
- "stddev": 0.1232975199525343,
- "median": 14.66410519462,
- "user": 86.51533105000001,
- "system": 1.2781065699999998,
- "min": 14.550273241620001,
- "max": 15.00217120962,
- "times": [
- 14.76833047162,
- 14.62487165762,
- 14.550273241620001,
- 14.760369668620001,
- 14.78581828762,
- 14.856696578620001,
- 14.76110289762,
- 14.64749807662,
- 14.59037134662,
- 14.86512815562,
- 14.72713868462,
- 14.58603997362,
- 15.00217120962,
- 14.61677551462,
- 14.57624728462,
- 14.75706327362,
- 14.57927932762,
- 14.58032688562,
- 14.68071231262,
- 14.57523245562
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node dynamic-worker-nodes.js",
- "mean": 14.048048310819999,
- "stddev": 0.14723886254177104,
- "median": 14.025298082119999,
- "user": 84.35732225,
- "system": 0.9675568199999999,
- "min": 13.838983238620001,
- "max": 14.40751339162,
- "times": [
- 13.98548984062,
- 14.08970463962,
- 13.87836158462,
- 13.99712773862,
- 14.07679108862,
- 13.939836404620001,
- 13.838983238620001,
- 13.85229790262,
- 14.064703445620001,
- 14.200368300620001,
- 13.898175762620001,
- 14.02633352062,
- 14.40751339162,
- 14.190043108620001,
- 14.207460342620001,
- 14.02383271262,
- 14.18817273162,
- 14.02426264362,
- 14.173625984620001,
- 13.89788183362
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node fixed-worker-nodes.js",
- "mean": 13.996590398470001,
- "stddev": 0.16909745188188294,
- "median": 13.994809645620002,
- "user": 84.36044275,
- "system": 0.9485802700000001,
- "min": 13.761760496620001,
- "max": 14.53081241762,
- "times": [
- 13.86936892962,
- 13.90594915762,
- 14.13784491862,
- 13.826044532620001,
- 13.98525799662,
- 14.53081241762,
- 14.04641502362,
- 14.07292816162,
- 13.99386185962,
- 13.80695795762,
- 14.095169697620001,
- 13.995757431620001,
- 13.89231966062,
- 14.131793033620001,
- 13.908948240620001,
- 14.07733845862,
- 14.01897876262,
- 14.047289388620001,
- 13.827011843620001,
- 13.761760496620001
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node dynamic-node-worker-threads-pool.mjs",
- "mean": 21.97662583142,
- "stddev": 0.6672546633141192,
- "median": 21.82985098262,
- "user": 131.04691445000003,
- "system": 3.0887052199999996,
- "min": 21.28345642562,
- "max": 24.28272923262,
- "times": [
- 21.50610942462,
- 21.804103540619998,
- 21.536169493619997,
- 21.87821395962,
- 21.595659144619997,
- 21.36212944262,
- 21.28345642562,
- 21.88421341662,
- 21.73865415062,
- 22.431645293619997,
- 21.41537478462,
- 21.85559842462,
- 21.99412199862,
- 21.74829523262,
- 21.54830455862,
- 22.52473501362,
- 22.48596393662,
- 22.190858179619998,
- 22.46618097462,
- 24.28272923262
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node static-node-worker-threads-pool.mjs",
- "mean": 14.306202341619999,
- "stddev": 0.2632666059144555,
- "median": 14.21780076962,
- "user": 85.15384659999998,
- "system": 1.07572542,
- "min": 14.08138596362,
- "max": 15.22225964962,
- "times": [
- 14.16626518162,
- 14.14619240662,
- 14.36406147262,
- 14.289970632620001,
- 14.14798653062,
- 15.22225964962,
- 14.167416942620001,
- 14.11097538862,
- 14.29138366262,
- 14.16712937262,
- 14.19873346362,
- 14.32046836662,
- 14.69497677562,
- 14.39514647662,
- 14.54020019162,
- 14.23686807562,
- 14.08138596362,
- 14.12801243562,
- 14.19700797862,
- 14.25760586462
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- },
- {
- "command": "node fixed-nanothreads.mjs",
- "mean": 13.275570773070001,
- "stddev": 0.17261045049305512,
- "median": 13.20598138862,
- "user": 82.18376609999999,
- "system": 0.8734752699999998,
- "min": 13.09431488162,
- "max": 13.69663597462,
- "times": [
- 13.12369985862,
- 13.43738152862,
- 13.23992474462,
- 13.09431488162,
- 13.40385113962,
- 13.69663597462,
- 13.58119932362,
- 13.17113666662,
- 13.26585302162,
- 13.17042117862,
- 13.09451195862,
- 13.485352284620001,
- 13.20894043762,
- 13.19463970562,
- 13.43447609162,
- 13.158138580620001,
- 13.13018234862,
- 13.28430560562,
- 13.20302233962,
- 13.13342779062
- ],
- "exit_codes": [
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0
- ]
- }
- ]
-}
+++ /dev/null
-| Command | Mean [s] | Min [s] | Max [s] | Relative |
-|:---|---:|---:|---:|---:|
-| `node dynamic-poolifier.mjs` | 11.551 ± 0.208 | 11.209 | 12.255 | 1.00 |
-| `node fixed-poolifier.mjs` | 11.613 ± 0.265 | 11.293 | 12.128 | 1.01 ± 0.03 |
-| `node dynamic-piscina.mjs` | 13.973 ± 0.126 | 13.819 | 14.197 | 1.21 ± 0.02 |
-| `node fixed-piscina.mjs` | 14.054 ± 0.240 | 13.858 | 14.725 | 1.22 ± 0.03 |
-| `node dynamic-tinypool.mjs` | 14.192 ± 0.199 | 13.948 | 14.808 | 1.23 ± 0.03 |
-| `node fixed-tinypool.mjs` | 14.097 ± 0.150 | 13.949 | 14.627 | 1.22 ± 0.03 |
-| `node dynamic-workerpool.mjs` | 14.675 ± 0.137 | 14.528 | 15.145 | 1.27 ± 0.03 |
-| `node fixed-workerpool.mjs` | 14.695 ± 0.123 | 14.550 | 15.002 | 1.27 ± 0.03 |
-| `node dynamic-worker-nodes.js` | 14.048 ± 0.147 | 13.839 | 14.408 | 1.22 ± 0.03 |
-| `node fixed-worker-nodes.js` | 13.997 ± 0.169 | 13.762 | 14.531 | 1.21 ± 0.03 |
-| `node dynamic-node-worker-threads-pool.mjs` | 21.977 ± 0.667 | 21.283 | 24.283 | 1.90 ± 0.07 |
-| `node static-node-worker-threads-pool.mjs` | 14.306 ± 0.263 | 14.081 | 15.222 | 1.24 ± 0.03 |
-| `node fixed-nanothreads.mjs` | 13.276 ± 0.173 | 13.094 | 13.697 | 1.15 ± 0.03 |
+++ /dev/null
-# Poolifier benchmarks versus other pools
-
-To run the benchmark versus other pools you will need to:
-
-- [Install hyperfine](https://github.com/sharkdp/hyperfine#installation)
-- Run `pnpm install` into the `versus-external-pools` folder
-- Run the `./bench.sh` script into the `versus-external-pools` folder
-
-> :warning: **Please be sure to use a quiet PC when you run the benchmarks**
+++ /dev/null
-#!/usr/bin/env bash
-
-usage() {
- echo "Usage: $0 [-s <pool size> -i <number of iterations> -t <CPU_INTENSIVE|IO_INTENSIVE>] [-n <number of tasks>]" 1>&2
- exit 1
-}
-
-while getopts "s:i:t:n:h" option
-do
- case "${option}" in
- s)
- poolSize=${OPTARG}
- ;;
- i)
- iterations=${OPTARG}
- ;;
- t)
- taskType=${OPTARG}
- ;;
- n)
- taskSize=${OPTARG}
- ;;
- :)
- echo "Error: Missing option argument for '-${OPTARG}'" >&2;
- usage
- ;;
- \?)
- # Invalid option
- echo "Error: Unknown or invalid option for '-${OPTARG}'" >&2;
- usage
- ;;
- *|h)
- usage
- ;;
- esac
-done
-
-taskType=${taskType:-'CPU_INTENSIVE'}
-taskSize=${taskSize:-5000}
-poolSize=${poolSize:-$(nproc --all)}
-numIterations=${iterations:-100000}
-
-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=${numIterations}
-case "$OSTYPE" in
- darwin*)
- caffeinate ./hyperfine_benchmarks.sh
- ;;
- linux*)
- systemd-inhibit --what=idle ./hyperfine_benchmarks.sh
- ;;
- *)
- echo "Unsupported $OSTYPE"
- ;;
-esac
+++ /dev/null
-import { DynamicPool } from 'node-worker-threads-pool'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-import functionToBench from './functions/function-to-bench.js'
-
-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 || 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 < numIterations; i++) {
- promises.add(
- dynamicPool.exec({
- task: functionToBench,
- param: data,
- timeout: 60000 // this is the same as poolifier default
- })
- )
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-import Piscina from 'piscina'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const piscina = new Piscina({
- filename: './workers/piscina/function-to-bench-worker.mjs',
- minThreads: Math.floor(size / 2),
- maxThreads: size,
- idleTimeout: 60000 // this is the same as poolifier default
-})
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(piscina.run(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-import { DynamicThreadPool } from 'poolifier'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const dynamicThreadPool = new DynamicThreadPool(
- Math.floor(size / 2),
- size,
- './workers/poolifier/function-to-bench-worker.mjs',
- {
- enableTasksQueue: false
- }
-)
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(dynamicThreadPool.execute(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-import Tinypool from 'tinypool'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const tinypool = new Tinypool({
- filename: './workers/tinypool/function-to-bench-worker.mjs',
- minThreads: Math.floor(size / 2),
- maxThreads: size,
- idleTimeout: 60000 // this is the same as poolifier default
-})
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(tinypool.run(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-'use strict'
-const WorkerNodes = require('worker-nodes')
-const { BenchmarkDefaults } = require('./utils.mjs')
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const workerNodes = new WorkerNodes(
- require.resolve('./workers/worker-nodes/function-to-bench-worker'),
- {
- minWorkers: Math.floor(size / 2),
- maxWorkers: size,
- taskTimeout: 60000 // this is the same as poolifier default
- }
-)
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(workerNodes.call.functionToBench(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-(async () => {
- try {
- await run()
- } catch (e) {
- console.error(e)
- // eslint-disable-next-line n/no-process-exit
- process.exit(1)
- }
-})()
+++ /dev/null
-import workerpool from 'workerpool'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-
-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 || BenchmarkDefaults.taskType,
- parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-]
-
-const workerPool = workerpool.pool(
- './workers/workerpool/function-to-bench-worker.mjs',
- {
- minWorkers: Math.floor(size / 2),
- maxWorkers: size,
- workerType: 'thread'
- }
-)
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(workerPool.exec('functionToBench', dataArray))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-import { ThreadPool } from 'nanothreads'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-import functionToBench from './functions/function-to-bench.js'
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const threadPool = new ThreadPool({
- task: functionToBench,
- count: size
-})
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(threadPool.exec(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-import Piscina from 'piscina'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const piscina = new Piscina({
- filename: './workers/piscina/function-to-bench-worker.mjs',
- minThreads: size,
- maxThreads: size,
- idleTimeout: 60000 // this is the same as poolifier default
-})
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(piscina.run(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-import { FixedThreadPool } from 'poolifier'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const fixedThreadPool = new FixedThreadPool(
- size,
- './workers/poolifier/function-to-bench-worker.mjs',
- {
- enableTasksQueue: false
- }
-)
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(fixedThreadPool.execute(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-import Tinypool from 'tinypool'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const tinypool = new Tinypool({
- filename: './workers/tinypool/function-to-bench-worker.mjs',
- minThreads: size,
- maxThreads: size,
- idleTimeout: 60000 // this is the same as poolifier default
-})
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(tinypool.run(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-'use strict'
-const WorkerNodes = require('worker-nodes')
-const { BenchmarkDefaults } = require('./utils.mjs')
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const workerNodes = new WorkerNodes(
- require.resolve('./workers/worker-nodes/function-to-bench-worker'),
- {
- minWorkers: size,
- maxWorkers: size,
- taskTimeout: 60000 // this is the same as poolifier default
- }
-)
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(workerNodes.call.functionToBench(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-(async () => {
- try {
- await run()
- } catch (e) {
- console.error(e)
- // eslint-disable-next-line n/no-process-exit
- process.exit(1)
- }
-})()
+++ /dev/null
-import workerpool from 'workerpool'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-
-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 || BenchmarkDefaults.taskType,
- parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-]
-
-const workerPool = workerpool.pool(
- './workers/workerpool/function-to-bench-worker.mjs',
- {
- minWorkers: size,
- maxWorkers: size,
- workerType: 'thread'
- }
-)
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(workerPool.exec('functionToBench', dataArray))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-'use strict'
-/**
- * The task function to execute during pools benchmarks.
- * NOTE: This function requires to be self-contained, thread-safe and re-entrant (node-worker-threads-pool requirement).
- * @param {*} data The worker data.
- * @returns {*} The result.
- */
-const functionToBench = data => {
- const crypto = require('node:crypto')
- const fs = require('node:fs')
- const TaskTypes = {
- CPU_INTENSIVE: 'CPU_INTENSIVE',
- IO_INTENSIVE: 'IO_INTENSIVE'
- }
- data = data || {}
- data.taskType = data.taskType || TaskTypes.CPU_INTENSIVE
- data.taskSize = data.taskSize || 5000
- const baseDirectory = `/tmp/poolifier-benchmarks/${crypto.randomInt(
- 281474976710655
- )}`
- switch (data.taskType) {
- case TaskTypes.CPU_INTENSIVE:
- // CPU intensive task
- for (let i = 0; i < data.taskSize; i++) {
- const o = {
- a: i
- }
- JSON.stringify(o)
- }
- return { ok: 1 }
- case TaskTypes.IO_INTENSIVE:
- // IO intensive task
- if (fs.existsSync(baseDirectory) === true) {
- fs.rmSync(baseDirectory, { recursive: true })
- }
- fs.mkdirSync(baseDirectory, { recursive: true })
- for (let i = 0; i < data.taskSize; i++) {
- const filePath = `${baseDirectory}/${i}`
- fs.writeFileSync(filePath, i.toString(), {
- encoding: 'utf8',
- flag: 'a'
- })
- fs.readFileSync(filePath, 'utf8')
- }
- fs.rmSync(baseDirectory, { recursive: true })
- return { ok: 1 }
- default:
- throw new Error(`Unknown task type: ${data.taskType}`)
- }
-}
-
-module.exports = functionToBench
+++ /dev/null
-#!/usr/bin/env bash
-
-hyperfine --export-markdown BENCH-100000.md --export-json BENCH-100000.json --min-runs 20 --prepare 'sleep 5' --warmup 3 --show-output \
- 'node dynamic-poolifier.mjs' \
- 'node fixed-poolifier.mjs' \
- 'node dynamic-piscina.mjs' \
- 'node fixed-piscina.mjs' \
- 'node dynamic-tinypool.mjs' \
- 'node fixed-tinypool.mjs' \
- 'node dynamic-workerpool.mjs' \
- 'node fixed-workerpool.mjs' \
- 'node dynamic-worker-nodes.js' \
- 'node fixed-worker-nodes.js' \
- 'node dynamic-node-worker-threads-pool.mjs' \
- 'node static-node-worker-threads-pool.mjs' \
- 'node fixed-nanothreads.mjs'
+++ /dev/null
-{
- "$schema": "https://json.schemastore.org/package",
- "name": "poolifier-benchmarks",
- "version": "1.0.0",
- "description": "This project contains benchmarks for the most used and popular Node.js worker_threads/cluster worker pools implementations",
- "private": true,
- "main": "index.js",
- "author": "pioardi",
- "engines": {
- "node": ">=16.14.0",
- "pnpm": ">=8.6.0"
- },
- "volta": {
- "node": "18.18.0",
- "pnpm": "8.7.6"
- },
- "scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "dependencies": {
- "nanothreads": "0.3.7",
- "node-worker-threads-pool": "1.5.1",
- "piscina": "4.1.0",
- "poolifier": "2.7.1",
- "tinypool": "0.8.1",
- "worker-nodes": "2.6.0",
- "workerpool": "6.5.0"
- }
-}
+++ /dev/null
-lockfileVersion: '6.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-dependencies:
- nanothreads:
- specifier: 0.3.7
- version: 0.3.7
- node-worker-threads-pool:
- specifier: 1.5.1
- version: 1.5.1
- piscina:
- specifier: 4.1.0
- version: 4.1.0
- poolifier:
- specifier: 2.7.1
- version: 2.7.1
- tinypool:
- specifier: 0.8.1
- version: 0.8.1
- worker-nodes:
- specifier: 2.6.0
- version: 2.6.0
- workerpool:
- specifier: 6.5.0
- version: 6.5.0
-
-packages:
-
- /@assemblyscript/loader@0.10.1:
- resolution: {integrity: sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==}
- dev: false
-
- /base64-js@1.5.1:
- resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
- dev: false
-
- /event-lite@0.1.3:
- resolution: {integrity: sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==}
- dev: false
-
- /eventemitter-asyncresource@1.0.0:
- resolution: {integrity: sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==}
- dev: false
-
- /hdr-histogram-js@2.0.3:
- resolution: {integrity: sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==}
- dependencies:
- '@assemblyscript/loader': 0.10.1
- base64-js: 1.5.1
- pako: 1.0.11
- dev: false
-
- /hdr-histogram-percentiles-obj@3.0.0:
- resolution: {integrity: sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==}
- dev: false
-
- /ieee754@1.2.1:
- resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
- dev: false
-
- /int64-buffer@0.1.10:
- resolution: {integrity: sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==}
- dev: false
-
- /isarray@1.0.0:
- resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
- dev: false
-
- /msgpack-lite@0.1.26:
- resolution: {integrity: sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==}
- hasBin: true
- dependencies:
- event-lite: 0.1.3
- ieee754: 1.2.1
- int64-buffer: 0.1.10
- isarray: 1.0.0
- dev: false
-
- /nanothreads@0.3.7:
- resolution: {integrity: sha512-l/gbxnQBeMGspLoa+JKhqDrsBtqMW4G5ElsEgbVigR5gl6IBHzBjpM7URGeu0UQN4k7DK0o+J3GmHgaXv+aDQw==}
- dev: false
-
- /nice-napi@1.0.2:
- resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==}
- os: ['!win32']
- requiresBuild: true
- dependencies:
- node-addon-api: 3.2.1
- node-gyp-build: 4.6.1
- dev: false
- optional: true
-
- /node-addon-api@3.2.1:
- resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==}
- requiresBuild: true
- dev: false
- optional: true
-
- /node-gyp-build@4.6.1:
- resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==}
- hasBin: true
- requiresBuild: true
- dev: false
- optional: true
-
- /node-worker-threads-pool@1.5.1:
- resolution: {integrity: sha512-7TXAhpMm+jO4MfESxYLtMGSnJWv+itdNHMdaFmeZuPXxwFGU90mtEB42BciUULXOUAxYBfXILAuvrSG3rQZ7mw==}
- dev: false
-
- /pako@1.0.11:
- resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
- dev: false
-
- /piscina@4.1.0:
- resolution: {integrity: sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==}
- dependencies:
- eventemitter-asyncresource: 1.0.0
- hdr-histogram-js: 2.0.3
- hdr-histogram-percentiles-obj: 3.0.0
- optionalDependencies:
- nice-napi: 1.0.2
- dev: false
-
- /poolifier@2.7.1:
- resolution: {integrity: sha512-GUo7sdUMvHyjMGHE5oMmmzlBYTASMQGznS6Nohl5eVsuLCZTIM5UyozRH47WYMAk9cqzEeoVzKKWpsQes/pCtg==}
- engines: {node: '>=16.14.0', pnpm: '>=8.6.0'}
- requiresBuild: true
- dev: false
-
- /tinypool@0.8.1:
- resolution: {integrity: sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==}
- engines: {node: '>=14.0.0'}
- dev: false
-
- /worker-nodes@2.6.0:
- resolution: {integrity: sha512-mL4PR1fktwqYQFfzsH613MdHcfi9GeXuwvl2lWIrNvr3JMmrtBBfbbhc/qSK3oZDAQ2gTd7qZbAJktto+3ZeFw==}
- engines: {node: '>=11.7.0'}
- dependencies:
- msgpack-lite: 0.1.26
- dev: false
-
- /workerpool@6.5.0:
- resolution: {integrity: sha512-r64Ea3glXY2RVzMeNxB+4J+0YHAVzUdV4cM5nHi4BBC2LvnO1pWFAIYKYuGcPElbg1/7eEiaPtZ/jzCjIUuGBg==}
- dev: false
+++ /dev/null
-import { StaticPool } from 'node-worker-threads-pool'
-import { BenchmarkDefaults, executeAsyncFn } from './utils.mjs'
-import functionToBench from './functions/function-to-bench.js'
-
-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 || BenchmarkDefaults.taskType,
- taskSize: parseInt(process.env.TASK_SIZE) || BenchmarkDefaults.taskSize
-}
-
-const staticPool = new StaticPool({
- size,
- task: functionToBench
-})
-
-async function run () {
- const promises = new Set()
- for (let i = 0; i < numIterations; i++) {
- promises.add(staticPool.exec(data))
- }
- await Promise.all(promises)
- // eslint-disable-next-line n/no-process-exit
- process.exit()
-}
-
-await executeAsyncFn(run)
+++ /dev/null
-import { availableParallelism } from 'poolifier'
-
-export const executeAsyncFn = async fn => {
- try {
- await fn()
- } catch (e) {
- console.error(e)
- // eslint-disable-next-line n/no-process-exit
- process.exit(1)
- }
-}
-
-export const BenchmarkDefaults = {
- poolSize: availableParallelism(),
- numIterations: 100000,
- taskType: 'CPU_INTENSIVE',
- taskSize: 5000
-}
+++ /dev/null
-import functionToBench from '../../functions/function-to-bench.js'
-export default functionToBench
+++ /dev/null
-import { ThreadWorker } from 'poolifier'
-import functionToBench from '../../functions/function-to-bench.js'
-export default new ThreadWorker(functionToBench)
+++ /dev/null
-import functionToBench from '../../functions/function-to-bench.js'
-export default functionToBench
+++ /dev/null
-'use strict'
-const functionToBench = require('../../functions/function-to-bench')
-module.exports = { functionToBench }
+++ /dev/null
-import workerpool from 'workerpool'
-import functionToBench from '../../functions/function-to-bench.js'
-
-const functionToBenchWrapper = (testName, taskType, taskSize) => {
- return functionToBench({
- test: testName,
- taskType,
- taskSize
- })
-}
-
-workerpool.worker({
- functionToBench: functionToBenchWrapper
-})
"files": {
"ignore": [
".nyc_output/",
- "benchmarks/versus-external-pools/BENCH-100000.*",
"coverage/",
"docs/**/*.css",
"docs/**/*.html",