Skip to content

Commit d104ee8

Browse files
mscdexjungx098
authored andcommitted
fs: include more fs.stat*() optimizations
Including: * Move async *stat() functions to FillStatsArray() now used by the sync *stat() functions * Avoid creating fs.Stats instances for implicit async/sync *stat() calls used in various fs functions * Store reference to Float64Array data on C++ side for easier/faster access, instead of passing from JS to C++ on every async/sync *stat() call PR-URL: nodejs#11665 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
1 parent 4f35253 commit d104ee8

10 files changed

+205
-244
lines changed

benchmark/fs/bench-stat.js

+16-6
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,30 @@ const common = require('../common');
44
const fs = require('fs');
55

66
const bench = common.createBenchmark(main, {
7-
n: [1e4],
8-
kind: ['lstat', 'stat']
7+
n: [20e4],
8+
kind: ['fstat', 'lstat', 'stat']
99
});
1010

1111

1212
function main(conf) {
1313
const n = conf.n >>> 0;
14+
const kind = conf.kind;
15+
var arg;
16+
if (kind === 'fstat')
17+
arg = fs.openSync(__filename, 'r');
18+
else
19+
arg = __filename;
1420

1521
bench.start();
1622
(function r(cntr, fn) {
17-
if (cntr-- <= 0)
18-
return bench.end(n);
19-
fn(__filename, function() {
23+
if (cntr-- <= 0) {
24+
bench.end(n);
25+
if (kind === 'fstat')
26+
fs.closeSync(arg);
27+
return;
28+
}
29+
fn(arg, function() {
2030
r(cntr, fn);
2131
});
22-
}(n, fs[conf.kind]));
32+
}(n, fs[kind]));
2333
}

benchmark/fs/bench-statSync.js

+12-25
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,23 @@ const common = require('../common');
44
const fs = require('fs');
55

66
const bench = common.createBenchmark(main, {
7-
n: [1e4],
7+
n: [1e6],
88
kind: ['fstatSync', 'lstatSync', 'statSync']
99
});
1010

1111

1212
function main(conf) {
1313
const n = conf.n >>> 0;
14-
var fn;
15-
var i;
16-
switch (conf.kind) {
17-
case 'statSync':
18-
case 'lstatSync':
19-
fn = fs[conf.kind];
20-
bench.start();
21-
for (i = 0; i < n; i++) {
22-
fn(__filename);
23-
}
24-
bench.end(n);
25-
break;
26-
case 'fstatSync':
27-
fn = fs.fstatSync;
28-
const fd = fs.openSync(__filename, 'r');
29-
bench.start();
30-
for (i = 0; i < n; i++) {
31-
fn(fd);
32-
}
33-
bench.end(n);
34-
fs.closeSync(fd);
35-
break;
36-
default:
37-
throw new Error('Invalid kind argument');
14+
const kind = conf.kind;
15+
const arg = (kind === 'fstatSync' ? fs.openSync(__filename, 'r') : __dirname);
16+
const fn = fs[conf.kind];
17+
18+
bench.start();
19+
for (var i = 0; i < n; i++) {
20+
fn(arg);
3821
}
22+
bench.end(n);
23+
24+
if (kind === 'fstat')
25+
fs.closeSync(arg);
3926
}

benchmark/fs/readFileSync.js

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
'use strict';
2+
3+
var common = require('../common.js');
4+
var fs = require('fs');
5+
6+
var bench = common.createBenchmark(main, {
7+
n: [60e4]
8+
});
9+
10+
function main(conf) {
11+
var n = +conf.n;
12+
13+
bench.start();
14+
for (var i = 0; i < n; ++i)
15+
fs.readFileSync(__filename);
16+
bench.end(n);
17+
}

0 commit comments

Comments
 (0)