chore(deps-dev): bump tatami-ng to 0.6.0
[poolifier.git] / benchmarks / benchmarks-utils.cjs
CommitLineData
4a8cea37 1const { randomInt } = require('node:crypto')
4a8cea37
JB
2const {
3 existsSync,
4 mkdirSync,
5 readFileSync,
6 rmSync,
3a502712 7 writeFileSync,
4a8cea37 8} = require('node:fs')
97231086 9
d35e5717 10const { TaskFunctions } = require('./benchmarks-types.cjs')
2d2e32c2 11
041dc05b 12const jsonIntegerSerialization = n => {
cdace0e5
JB
13 for (let i = 0; i < n; i++) {
14 const o = {
3a502712 15 a: i,
cdace0e5
JB
16 }
17 JSON.stringify(o)
18 }
30b963d4 19 return { ok: 1 }
cdace0e5
JB
20}
21
bdacc2d2 22/**
3a502712
JB
23 * @param n - The number of fibonacci numbers to generate.
24 * @returns - The nth fibonacci number.
bdacc2d2 25 */
041dc05b 26const fibonacci = n => {
66f0c14c
JB
27 n = BigInt(n)
28 let current = 1n
29 let previous = 0n
30 while (--n) {
31 const tmp = current
32 current += previous
33 previous = tmp
34 }
d83e2353
JB
35 // cluster worker do not support BigInt
36 return current.toString()
bdacc2d2
JB
37}
38
7d82d90e 39/**
3a502712
JB
40 * @param n - The number to calculate the factorial of.
41 * @returns - The factorial of n.
7d82d90e 42 */
041dc05b 43const factorial = n => {
66f0c14c
JB
44 if (n === 0 || n === 1) {
45 return 1n
46 } else {
47 n = BigInt(n)
48 let factorial = 1n
49 for (let i = 1n; i <= n; i++) {
50 factorial *= i
51 }
d83e2353
JB
52 // cluster worker do not support BigInt
53 return factorial.toString()
7d82d90e
JB
54 }
55}
56
bac873bd 57const readWriteFiles = (
670734fc 58 n,
4a8cea37 59 baseDirectory = `/tmp/poolifier-benchmarks/${randomInt(281474976710655)}`
bac873bd 60) => {
4a8cea37
JB
61 if (existsSync(baseDirectory) === true) {
62 rmSync(baseDirectory, { recursive: true })
cdace0e5 63 }
4a8cea37 64 mkdirSync(baseDirectory, { recursive: true })
cdace0e5
JB
65 for (let i = 0; i < n; i++) {
66 const filePath = `${baseDirectory}/${i}`
4a8cea37 67 writeFileSync(filePath, i.toString(), {
cdace0e5 68 encoding: 'utf8',
3a502712 69 flag: 'a',
cdace0e5 70 })
4a8cea37 71 readFileSync(filePath, 'utf8')
cdace0e5 72 }
4a8cea37 73 rmSync(baseDirectory, { recursive: true })
30b963d4 74 return { ok: 1 }
cdace0e5
JB
75}
76
ab7bb4f8 77const executeTaskFunction = data => {
2d2e32c2 78 switch (data.function) {
dbca3be9 79 case TaskFunctions.jsonIntegerSerialization:
d1a9aa41 80 return jsonIntegerSerialization(data.taskSize || 1000)
dbca3be9 81 case TaskFunctions.fibonacci:
d1a9aa41 82 return fibonacci(data.taskSize || 1000)
dbca3be9 83 case TaskFunctions.factorial:
d1a9aa41 84 return factorial(data.taskSize || 1000)
dbca3be9 85 case TaskFunctions.readWriteFiles:
cdace0e5 86 return readWriteFiles(data.taskSize || 1000)
2d2e32c2 87 default:
dbca3be9 88 throw new Error('Unknown task function')
2d2e32c2
JB
89 }
90}
ab7bb4f8
JB
91
92module.exports = {
3a502712 93 executeTaskFunction,
ab7bb4f8 94}