diff --git a/benchmark/fs/bench-readdir.js b/benchmark/fs/bench-readdir.js index a3e19e242dadbe..0d8ed04856515f 100644 --- a/benchmark/fs/bench-readdir.js +++ b/benchmark/fs/bench-readdir.js @@ -5,16 +5,19 @@ const fs = require('fs'); const path = require('path'); const bench = common.createBenchmark(main, { - n: [1e4], + n: [10], + dir: [ 'lib', 'test/parallel'], + withFileTypes: ['true', 'false'] }); - -function main({ n }) { +function main({ n, dir, withFileTypes }) { + withFileTypes = withFileTypes === 'true'; + const fullPath = path.resolve(__dirname, '../../', dir); bench.start(); (function r(cntr) { if (cntr-- <= 0) return bench.end(n); - fs.readdir(path.resolve(__dirname, '../../lib/'), function() { + fs.readdir(fullPath, { withFileTypes }, function() { r(cntr); }); }(n)); diff --git a/benchmark/fs/bench-readdirSync.js b/benchmark/fs/bench-readdirSync.js index ef3327163e8c22..5d0e97399a33ff 100644 --- a/benchmark/fs/bench-readdirSync.js +++ b/benchmark/fs/bench-readdirSync.js @@ -5,14 +5,18 @@ const fs = require('fs'); const path = require('path'); const bench = common.createBenchmark(main, { - n: [1e4], + n: [10], + dir: [ 'lib', 'test/parallel'], + withFileTypes: ['true', 'false'] }); -function main({ n }) { +function main({ n, dir, withFileTypes }) { + withFileTypes = withFileTypes === 'true'; + const fullPath = path.resolve(__dirname, '../../', dir); bench.start(); for (var i = 0; i < n; i++) { - fs.readdirSync(path.resolve(__dirname, '../../lib/')); + fs.readdirSync(fullPath, { withFileTypes }); } bench.end(n); } diff --git a/src/node_file.cc b/src/node_file.cc index 6333f8d8626f52..fc826ffe6920a6 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -571,7 +571,7 @@ void AfterScanDir(uv_fs_t* req) { Environment* env = req_wrap->env(); Local error; int r; - std::vector> name_argv; + std::vector> name_v; for (int i = 0; ; i++) { uv_dirent_t ent; @@ -593,12 +593,10 @@ void AfterScanDir(uv_fs_t* req) { if (filename.IsEmpty()) return req_wrap->Reject(error); - name_argv.push_back(filename.ToLocalChecked()); + name_v.push_back(filename.ToLocalChecked()); } - Local names = - Array::New(env->isolate(), name_argv.data(), name_argv.size()); - req_wrap->Resolve(names); + req_wrap->Resolve(Array::New(env->isolate(), name_v.data(), name_v.size())); } void AfterScanDirWithTypes(uv_fs_t* req) { @@ -613,13 +611,9 @@ void AfterScanDirWithTypes(uv_fs_t* req) { Isolate* isolate = env->isolate(); Local error; int r; - Local names = Array::New(isolate, 0); - Local fn = env->push_values_to_array_function(); - Local name_argv[NODE_PUSH_VAL_TO_ARRAY_MAX]; - size_t name_idx = 0; - Local types = Array::New(isolate, 0); - Local type_argv[NODE_PUSH_VAL_TO_ARRAY_MAX]; - size_t type_idx = 0; + + std::vector> name_v; + std::vector> type_v; for (int i = 0; ; i++) { uv_dirent_t ent; @@ -641,48 +635,13 @@ void AfterScanDirWithTypes(uv_fs_t* req) { if (filename.IsEmpty()) return req_wrap->Reject(error); - name_argv[name_idx++] = filename.ToLocalChecked(); - - if (name_idx >= arraysize(name_argv)) { - MaybeLocal ret = fn->Call(env->context(), names, name_idx, - name_argv); - if (ret.IsEmpty()) { - return; - } - name_idx = 0; - } - - type_argv[type_idx++] = Integer::New(isolate, ent.type); - - if (type_idx >= arraysize(type_argv)) { - MaybeLocal ret = fn->Call(env->context(), types, type_idx, - type_argv); - if (ret.IsEmpty()) { - return; - } - type_idx = 0; - } - } - - if (name_idx > 0) { - MaybeLocal ret = fn->Call(env->context(), names, name_idx, - name_argv); - if (ret.IsEmpty()) { - return; - } - } - - if (type_idx > 0) { - MaybeLocal ret = fn->Call(env->context(), types, type_idx, - type_argv); - if (ret.IsEmpty()) { - return; - } + name_v.push_back(filename.ToLocalChecked()); + type_v.push_back(Integer::New(isolate, ent.type)); } Local result = Array::New(isolate, 2); - result->Set(0, names); - result->Set(1, types); + result->Set(0, Array::New(isolate, name_v.data(), name_v.size())); + result->Set(1, Array::New(isolate, type_v.data(), type_v.size())); req_wrap->Resolve(result); } @@ -1523,9 +1482,8 @@ static void ReadDir(const FunctionCallbackInfo& args) { Local names = Array::New(isolate, name_v.data(), name_v.size()); if (with_types) { Local result = Array::New(isolate, 2); - Local types = Array::New(isolate, type_v.data(), type_v.size()); result->Set(0, names); - result->Set(1, types); + result->Set(1, Array::New(isolate, type_v.data(), type_v.size())); args.GetReturnValue().Set(result); } else { args.GetReturnValue().Set(names); diff --git a/test/parallel/test-benchmark-fs.js b/test/parallel/test-benchmark-fs.js index ad01b4e5803ce5..7ae32fe617d58f 100644 --- a/test/parallel/test-benchmark-fs.js +++ b/test/parallel/test-benchmark-fs.js @@ -16,5 +16,7 @@ runBenchmark('fs', [ 'statType=fstat', 'statSyncType=fstatSync', 'encodingType=buf', - 'filesize=1024' + 'filesize=1024', + 'dir=.github', + 'withFileTypes=false' ], { NODE_TMPDIR: tmpdir.path, NODEJS_BENCHMARK_ZERO_ALLOWED: 1 });