-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbench.js
126 lines (110 loc) · 2.46 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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const fs = require("fs");
function initBuf(bufSize) {
const buf = new Uint8Array(bufSize);
for (let i = 0; i < buf.length; ++i) {
buf[i] = Math.round(Math.random() * 255) & 0xff;
}
return buf;
}
function write(fd, buf, offset, length) {
return new Promise((resolve, reject) => {
fs.write(fd, buf, offset, length, (err, nbytes) => {
if (err) {
reject(err);
return;
}
resolve(nbytes);
});
});
}
function open(filePath, mode) {
return new Promise((resolve, reject) => {
fs.open(filePath, mode, (err, fd) => {
if (err) {
reject(err);
return;
}
resolve(fd);
});
});
}
function fsync(fd) {
return new Promise((resolve, reject) => {
fs.fsync(fd, (err) => {
if (err) {
reject(err);
return;
}
resolve();
});
});
}
function close(fd) {
return new Promise((resolve, reject) => {
fs.close(fd, (err) => {
if (err) {
reject(err);
return;
}
resolve();
});
});
}
async function writeFile(filePath, buf) {
const fd = await open(filePath, "w"),
bufSize = buf.length;
let nbytes,
cursor = 0;
while (
0 < (nbytes = await write(fd, buf, cursor, bufSize - cursor)) &&
(cursor += nbytes) < bufSize
);
return fd;
}
async function closeFile(fd, doFsync = true) {
doFsync && (await fsync(fd));
await close(fd);
}
function round(value, decimalPoints) {
const factor = 10 ** decimalPoints;
return Math.round(value * factor) / factor;
}
(async function main() {
const buf = initBuf(1 << 16),
iterations = 1024,
files = [],
{ hrtime } = process;
for (let i = 0; i < iterations; ++i) {
files.push(`./files/bench-${i}`);
}
const start = hrtime.bigint();
await Promise.all(
files.map((filePath) =>
(async () => {
const fd = await writeFile(filePath, buf);
await closeFile(fd, true);
})()
)
);
const stop = hrtime.bigint();
// unlink written files
await Promise.all(
files.map(
(filePath) =>
new Promise((resolve, reject) => {
fs.unlink(filePath, (err) => {
if (err) {
reject(err);
return;
}
resolve();
});
})
)
);
const deltaInNs = Number(stop - start);
console.log(`duration: ${round(deltaInNs / 10e6, 3)} ms`);
console.log(
`throughput: ${round((buf.length * iterations) / deltaInNs, 3)} GB/s`
);
})();