Commit | Line | Data |
---|---|---|
4a8cea37 | 1 | const { randomInt } = require('node:crypto') |
4a8cea37 JB |
2 | const { |
3 | existsSync, | |
4 | mkdirSync, | |
5 | readFileSync, | |
6 | rmSync, | |
3a502712 | 7 | writeFileSync, |
4a8cea37 | 8 | } = require('node:fs') |
97231086 | 9 | |
d35e5717 | 10 | const { TaskFunctions } = require('./benchmarks-types.cjs') |
2d2e32c2 | 11 | |
041dc05b | 12 | const 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 | 26 | const 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 | 43 | const 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 | 57 | const 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 | 77 | const 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 | |
92 | module.exports = { | |
3a502712 | 93 | executeTaskFunction, |
ab7bb4f8 | 94 | } |