diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-10-09 01:23:18 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-10-11 23:09:39 +0200 |
commit | 5c93aab278f6e09e345270b3a0fe49c591a0424f (patch) | |
tree | 7ba5931ecb38d399154e7fb1f28975eec3bb5344 /benchmark | |
parent | c0305af2c4aba6d6ecd39eb100a59998d87ddc69 (diff) | |
download | android-node-v8-5c93aab278f6e09e345270b3a0fe49c591a0424f.tar.gz android-node-v8-5c93aab278f6e09e345270b3a0fe49c591a0424f.tar.bz2 android-node-v8-5c93aab278f6e09e345270b3a0fe49c591a0424f.zip |
fs: buffer dir entries in opendir()
Read up to 32 directory entries in one batch when `dir.readSync()`
or `dir.read()` are called.
This increases performance significantly, although it introduces
quite a bit of edge case complexity.
confidence improvement accuracy (*) (**) (***)
fs/bench-opendir.js mode='async' dir='lib' n=100 *** 155.93 % ±30.05% ±40.34% ±53.21%
fs/bench-opendir.js mode='async' dir='test/parallel' n=100 *** 479.65 % ±56.81% ±76.47% ±101.32%
fs/bench-opendir.js mode='sync' dir='lib' n=100 10.38 % ±14.39% ±19.16% ±24.96%
fs/bench-opendir.js mode='sync' dir='test/parallel' n=100 *** 63.13 % ±12.84% ±17.18% ±22.58%
PR-URL: https://github.com/nodejs/node/pull/29893
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/fs/bench-opendir.js | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/benchmark/fs/bench-opendir.js b/benchmark/fs/bench-opendir.js new file mode 100644 index 0000000000..419c3a231a --- /dev/null +++ b/benchmark/fs/bench-opendir.js @@ -0,0 +1,51 @@ +'use strict'; + +const common = require('../common'); +const fs = require('fs'); +const path = require('path'); + +const bench = common.createBenchmark(main, { + n: [100], + dir: [ 'lib', 'test/parallel'], + mode: [ 'async', 'sync', 'callback' ] +}); + +async function main({ n, dir, mode }) { + const fullPath = path.resolve(__dirname, '../../', dir); + + bench.start(); + + let counter = 0; + for (let i = 0; i < n; i++) { + if (mode === 'async') { + // eslint-disable-next-line no-unused-vars + for await (const entry of await fs.promises.opendir(fullPath)) + counter++; + } else if (mode === 'callback') { + const dir = await fs.promises.opendir(fullPath); + await new Promise((resolve, reject) => { + function read() { + dir.read((err, entry) => { + if (err) { + reject(err); + } else if (entry === null) { + resolve(dir.close()); + } else { + counter++; + read(); + } + }); + } + + read(); + }); + } else { + const dir = fs.opendirSync(fullPath); + while (dir.readSync() !== null) + counter++; + dir.closeSync(); + } + } + + bench.end(counter); +} |