summaryrefslogtreecommitdiff
path: root/benchmark
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-10-09 01:23:18 +0200
committerAnna Henningsen <anna@addaleax.net>2019-10-11 23:09:39 +0200
commit5c93aab278f6e09e345270b3a0fe49c591a0424f (patch)
tree7ba5931ecb38d399154e7fb1f28975eec3bb5344 /benchmark
parentc0305af2c4aba6d6ecd39eb100a59998d87ddc69 (diff)
downloadandroid-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.js51
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);
+}