buffer: faster case for create Buffer from new Buffer(0)
authorJackson Tian <shyvo1987@gmail.com>
Thu, 17 Dec 2015 09:44:34 +0000 (17:44 +0800)
committerMyles Borins <mborins@us.ibm.com>
Tue, 19 Jan 2016 19:52:32 +0000 (11:52 -0800)
When create Buffer from a Buffer will copy data
from old to new even though length is zero.

This patch can improve edge case 4x faster.
following is benchmark results.

new: buffers/buffer_zero.js n=1024: 2463.53891
old: buffers/buffer_zero.js n=1024: 618.70801

PR-URL: https://github.com/nodejs/node/pull/4326
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
benchmark/buffers/buffer_zero.js [new file with mode: 0644]
lib/buffer.js

diff --git a/benchmark/buffers/buffer_zero.js b/benchmark/buffers/buffer_zero.js
new file mode 100644 (file)
index 0000000..4613787
--- /dev/null
@@ -0,0 +1,18 @@
+'use strict';
+
+const common = require('../common.js');
+
+const bench = common.createBenchmark(main, {
+  n: [1024]
+});
+
+const zero = new Buffer(0);
+
+function main(conf) {
+  var n = +conf.n;
+  bench.start();
+  for (let i = 0; i < n * 1024; i++) {
+    new Buffer(zero);
+  }
+  bench.end(n);
+}
index 378dde7..31deb52 100644 (file)
@@ -123,6 +123,10 @@ function fromString(string, encoding) {
 function fromObject(obj) {
   if (obj instanceof Buffer) {
     var b = allocate(obj.length);
+
+    if (b.length === 0)
+      return b;
+
     obj.copy(b, 0, 0, obj.length);
     return b;
   }