| // Test the throughput of the fs.WriteStream class. |
| '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 encodingType, encoding, size, filesize; |
| |
| const bench = common.createBenchmark(main, { |
| encodingType: ['buf', 'asc', 'utf'], |
| filesize: [1000 * 1024 * 1024], |
| size: [1024, 4096, 65535, 1024 * 1024] |
| }); |
| |
| function main(conf) { |
| encodingType = conf.encodingType; |
| size = conf.size; |
| filesize = conf.filesize; |
| |
| switch (encodingType) { |
| case 'buf': |
| encoding = null; |
| break; |
| case 'asc': |
| encoding = 'ascii'; |
| break; |
| case 'utf': |
| encoding = 'utf8'; |
| break; |
| default: |
| throw new Error(`invalid encodingType: ${encodingType}`); |
| } |
| |
| makeFile(); |
| } |
| |
| function runTest() { |
| assert(fs.statSync(filename).size === filesize); |
| const rs = fs.createReadStream(filename, { |
| highWaterMark: size, |
| encoding: encoding |
| }); |
| |
| rs.on('open', () => { |
| bench.start(); |
| }); |
| |
| let bytes = 0; |
| rs.on('data', (chunk) => { |
| bytes += chunk.length; |
| }); |
| |
| rs.on('end', () => { |
| try { fs.unlinkSync(filename); } catch {} |
| // MB/sec |
| bench.end(bytes / (1024 * 1024)); |
| }); |
| } |
| |
| function makeFile() { |
| const buf = Buffer.allocUnsafe(filesize / 1024); |
| if (encoding === 'utf8') { |
| // ΓΌ |
| for (let i = 0; i < buf.length; i++) { |
| buf[i] = i % 2 === 0 ? 0xC3 : 0xBC; |
| } |
| } else if (encoding === 'ascii') { |
| buf.fill('a'); |
| } else { |
| buf.fill('x'); |
| } |
| |
| try { fs.unlinkSync(filename); } catch {} |
| let w = 1024; |
| const ws = fs.createWriteStream(filename); |
| ws.on('close', runTest); |
| ws.on('drain', write); |
| write(); |
| function write() { |
| do { |
| w--; |
| } while (false !== ws.write(buf) && w > 0); |
| if (w === 0) |
| ws.end(); |
| } |
| } |