diff options
author | Nitzan Uziely <linkgoron@gmail.com> | 2021-03-05 22:25:26 +0300 |
---|---|---|
committer | Benjamin Gruenbaum <benjamingr@gmail.com> | 2021-03-10 19:00:58 +0300 |
commit | b9fd4eb651dd26c3845aa46714593abae185455d (patch) | |
tree | 189fb4f624f7fb01a2c74e8102d8d9af7de766d5 /benchmark | |
parent | e216d8f4a1277e77903e9c2c716fefa3b196761b (diff) |
fs: add promisified readFile benchmark
add a benchmark for fs.promises.readFile
PR-URL: https://github.com/nodejs/node/pull/37608
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/fs/readfile-promises.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/benchmark/fs/readfile-promises.js b/benchmark/fs/readfile-promises.js new file mode 100644 index 00000000000..28633c3f064 --- /dev/null +++ b/benchmark/fs/readfile-promises.js @@ -0,0 +1,63 @@ +// Call fs.promises.readFile over and over again really fast. +// Then see how many times it got called. +// Yes, this is a silly benchmark. Most benchmarks are silly. +'use strict'; + +const path = require('path'); +const common = require('../common.js'); +const fs = require('fs'); +const assert = require('assert'); + +const tmpdir = require('../../test/common/tmpdir'); +tmpdir.refresh(); +const filename = path.resolve(tmpdir.path, + `.removeme-benchmark-garbage-${process.pid}`); + +const bench = common.createBenchmark(main, { + duration: [5], + len: [1024, 16 * 1024 * 1024], + concurrent: [1, 10] +}); + +function main({ len, duration, concurrent }) { + try { fs.unlinkSync(filename); } catch { } + let data = Buffer.alloc(len, 'x'); + fs.writeFileSync(filename, data); + data = null; + + let writes = 0; + let benchEnded = false; + bench.start(); + setTimeout(() => { + benchEnded = true; + bench.end(writes); + try { fs.unlinkSync(filename); } catch { } + process.exit(0); + }, duration * 1000); + + function read() { + fs.promises.readFile(filename) + .then((res) => afterRead(undefined, res)) + .catch((err) => afterRead(err)); + } + + function afterRead(er, data) { + if (er) { + if (er.code === 'ENOENT') { + // Only OK if unlinked by the timer from main. + assert.ok(benchEnded); + return; + } + throw er; + } + + if (data.length !== len) + throw new Error('wrong number of bytes returned'); + + writes++; + if (!benchEnded) + read(); + } + + while (concurrent--) read(); +} |