diff options
author | Nitzan Uziely <linkgoron@gmail.com> | 2021-03-05 22:19:53 +0300 |
---|---|---|
committer | Antoine du Hamel <duhamelantoine1995@gmail.com> | 2021-03-13 15:41:00 +0300 |
commit | a97f01ea8cb3b421dfe70c0271b9b37e549b8b0b (patch) | |
tree | 017f9d7071d7a2835e2aa6f40ff30b3b3d2d19c2 /benchmark | |
parent | e1ce7f1194ce81188e080fca0ec6fb80db842c5d (diff) |
benchmark: add benchmark for fsPromises.writeFile
added fs.promises.writeFile benchmark
PR-URL: https://github.com/nodejs/node/pull/37610
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Darshan Sen <raisinten@gmail.com>
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/fs/writefile-promises.js | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/benchmark/fs/writefile-promises.js b/benchmark/fs/writefile-promises.js new file mode 100644 index 00000000000..2ba25184ff3 --- /dev/null +++ b/benchmark/fs/writefile-promises.js @@ -0,0 +1,76 @@ +// Call fs.promises.writeFile over and over again really fast. +// Then see how many times it got called. +// Yes, this is a silly benchmark. Most benchmarks are silly. +'use strict'; + +const path = require('path'); +const common = require('../common.js'); +const fs = require('fs'); +const assert = require('assert'); +const tmpdir = require('../../test/common/tmpdir'); + +tmpdir.refresh(); +const filename = path.resolve(tmpdir.path, + `.removeme-benchmark-garbage-${process.pid}`); +let filesWritten = 0; +const bench = common.createBenchmark(main, { + duration: [5], + encodingType: ['buf', 'asc', 'utf'], + size: [2, 1024, 65535, 1024 * 1024], + concurrent: [1, 10] +}); + +function main({ encodingType, duration, concurrent, size }) { + let encoding; + let chunk; + switch (encodingType) { + case 'buf': + chunk = Buffer.alloc(size, 'b'); + break; + case 'asc': + chunk = 'a'.repeat(size); + encoding = 'ascii'; + break; + case 'utf': + chunk = 'ΓΌ'.repeat(Math.ceil(size / 2)); + encoding = 'utf8'; + break; + default: + throw new Error(`invalid encodingType: ${encodingType}`); + } + + let writes = 0; + let benchEnded = false; + bench.start(); + setTimeout(() => { + benchEnded = true; + bench.end(writes); + for (let i = 0; i < filesWritten; i++) { + try { fs.unlinkSync(`${filename}-${i}`); } catch { } + } + process.exit(0); + }, duration * 1000); + + function write() { + fs.promises.writeFile(`${filename}-${filesWritten++}`, chunk, encoding) + .then(() => afterWrite()) + .catch((err) => afterWrite(err)); + } + + function afterWrite(er) { + if (er) { + if (er.code === 'ENOENT') { + // Only OK if unlinked by the timer from main. + assert.ok(benchEnded); + return; + } + throw er; + } + + writes++; + if (!benchEnded) + write(); + } + + while (concurrent--) write(); +} |