node
node copied to clipboard
fs: improve `ExistsSync` performance on Windows
Simplifies code by using std::filesystem
. Since std::filesystem is C++17, this pull-request can be backported to 18 and 20.
The following benchmark shows 2% improvement, but I'm sure if we had a Windows benchmark-ci machine it would have better results. Especially for symlinks, we are now not executing 2 different operating-system calls, and only one.
FYI: std::filesystem::exists follows symlinks.
Benchmark code:
const fs = require('node:fs');
const exists = fs.existsSync(__filename);
console.log(exists);
Benchmark result:
PS C:\Users\yagiz\Desktop\coding\node> hyperfine ".\out\Release\node .\exists-bench.js" " .\node-pr .\exists-bench.js" --warmup 10
Benchmark 1: .\out\Release\node .\exists-bench.js
Time (mean ± σ): 48.8 ms ± 2.9 ms [User: 2.2 ms, System: 3.3 ms]
Range (min … max): 41.6 ms … 55.3 ms 56 runs
Benchmark 2: .\node-pr .\exists-bench.js
Time (mean ± σ): 47.7 ms ± 2.0 ms [User: 1.3 ms, System: 2.8 ms]
Range (min … max): 42.2 ms … 50.5 ms 60 runs
Summary
.\node-pr .\exists-bench.js ran
1.02 ± 0.07 times faster than .\out\Release\node .\exists-bench.js
cc @nodejs/fs @nodejs/platform-windows