bench: Add read-stream throughput
authorisaacs <i@izs.me>
Tue, 12 Feb 2013 05:05:43 +0000 (21:05 -0800)
committerisaacs <i@izs.me>
Tue, 19 Feb 2013 22:14:36 +0000 (14:14 -0800)
benchmark/fs/read-stream-throughput.js [new file with mode: 0644]

diff --git a/benchmark/fs/read-stream-throughput.js b/benchmark/fs/read-stream-throughput.js
new file mode 100644 (file)
index 0000000..af9a235
--- /dev/null
@@ -0,0 +1,87 @@
+// test the througput of the fs.WriteStream class.
+
+var path = require('path');
+var common = require('../common.js');
+var filename = path.resolve(__dirname, '.removeme-benchmark-garbage');
+var fs = require('fs');
+var filesize = 1000 * 1024 * 1024;
+var assert = require('assert');
+
+var type, encoding, size;
+
+var bench = common.createBenchmark(main, {
+  type: ['buf', 'asc', 'utf'],
+  size: [1024, 4096, 65535, 1024*1024]
+});
+
+function main(conf) {
+  type = conf.type;
+  size = +conf.size;
+
+  switch (type) {
+    case 'buf':
+      encoding = null;
+      break;
+    case 'asc':
+      encoding = 'ascii';
+      break;
+    case 'utf':
+      encoding = 'utf8';
+      break;
+    default:
+      throw new Error('invalid type');
+  }
+
+  makeFile(runTest);
+}
+
+function runTest() {
+  assert(fs.statSync(filename).size === filesize);
+  var rs = fs.createReadStream(filename, {
+    bufferSize: size,
+    encoding: encoding
+  });
+
+  rs.on('open', function() {
+    bench.start();
+  });
+
+  var bytes = 0;
+  rs.on('data', function(chunk) {
+    bytes += chunk.length;
+  });
+
+  rs.on('end', function() {
+    try { fs.unlinkSync(filename); } catch (e) {}
+    // MB/sec
+    bench.end(bytes / (1024 * 1024));
+  });
+}
+
+function makeFile() {
+  var buf = new Buffer(filesize / 1024);
+  if (encoding === 'utf8') {
+    // ΓΌ
+    for (var 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 (e) {}
+  var w = 1024;
+  var 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();
+  }
+}