-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbench.js
86 lines (74 loc) · 2.63 KB
/
bench.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import FastColorGenerator from "./dist/index.js";
import { performance } from "node:perf_hooks";
import { serialize } from "v8";
function getMemoryUsageOfReference(ref) {
const serialized = serialize(ref); // Convert the reference to a Buffer
return serialized.length; // The size of the serialized Buffer in bytes
}
function generateSeededColor(seed = 1_000_000) {
let hash = 0;
for (let i = 0; i < seed.length; i++) {
hash = (hash << 5) - hash + seed.charCodeAt(i);
hash |= 0; // Convert to 32bit integer
}
hash = (hash * 16807) % 2147483647; // A common multiplier for randomness
const random = (hash & 0xffffff) / 0xffffff; // Return a normalized value [0, 1]
const color = `#${Math.floor(random * 0xffffff)
.toString(16)
.padStart(6, "0")}`;
return color;
}
function testSimpleFunction(amount, analyzeMemory = true) {
const startTime = performance.now();
let color = "";
for (let i = 0; i < amount; i++) {
color = generateSeededColor();
}
const endTime = performance.now();
const usedMemory = analyzeMemory ? getMemoryUsageOfReference(color) : 0;
return { usedMemory, startTime, endTime };
}
testSimpleFunction._name = "Simple function ";
function testFastColorGenerator(amount, analyzeMemory = true) {
const fastColorGenerator = new FastColorGenerator();
const startTime = performance.now();
let color = "";
for (let i = 0; i < amount; i++) {
fastColorGenerator.next();
color = fastColorGenerator.hex;
}
const endTime = performance.now();
const usedMemory = analyzeMemory ? getMemoryUsageOfReference(color) : 0;
return { usedMemory, startTime, endTime };
}
testFastColorGenerator._name = "Fast Color Generator";
function performanceTest(test, amount) {
const runs = 10; // Number of times to run the test
let totalTime = 0;
let totalMemory = 0;
for (let i = 0; i < runs; i++) {
const { startTime, endTime, usedMemory } = test(amount);
totalTime += endTime - startTime;
totalMemory += usedMemory;
}
const averageTime = (totalTime / runs).toFixed(8);
const averageMemory = totalMemory / runs;
console.log(
`${test._name}: ${averageTime} ms | ${
test.name.includes("Set") ? averageMemory + " Bytes" : "N/A"
} | ${amount} colors`
);
}
// Run tests
console.clear();
[1, 100, 1_000, 10_000, 100_000, 1_000_000, 256 * 256 * 256].forEach(
async (amount) => {
console.log("");
[testSimpleFunction, testFastColorGenerator].forEach((test) => {
performanceTest(test, amount);
});
await new Promise((resolve) => {
setTimeout(resolve, 5_000); // Let garbadge collection do its thing for more accurate memory logging
});
}
);