From db65594c330b4e4a625d242282f37b879a30b43d Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Mon, 4 Mar 2019 01:34:00 +0100 Subject: [PATCH] benchmark: refactor buffer benchmarks Currently the buffer benchmarks take significantly too long to complete. This drastically reduces the overall runtime by removing obsolete checked variations and reducing the iteration count. It also improves the benchmarks by removing the deprecated `new Buffer(size)` usage and some other small improvements. PR-URL: https://github.com/nodejs/node/pull/26418 Reviewed-By: Matteo Collina Reviewed-By: Gireesh Punathil Reviewed-By: Peter Marshall Reviewed-By: Franziska Hinkelmann Reviewed-By: Anatoli Papirovski Reviewed-By: Rich Trott --- benchmark/buffers/buffer-bytelength.js | 4 +-- .../buffers/buffer-compare-instance-method.js | 20 ++------------- benchmark/buffers/buffer-compare-offset.js | 2 +- benchmark/buffers/buffer-compare.js | 2 +- benchmark/buffers/buffer-concat.js | 10 ++++---- benchmark/buffers/buffer-creation.js | 18 ++++--------- benchmark/buffers/buffer-fill.js | 2 +- benchmark/buffers/buffer-from.js | 25 ++++++++++--------- benchmark/buffers/buffer-hex.js | 4 +-- benchmark/buffers/buffer-indexof-number.js | 6 +++-- benchmark/buffers/buffer-indexof.js | 8 ++---- benchmark/buffers/buffer-iterate.js | 13 +++++----- .../buffers/buffer-normalize-encoding.js | 5 ---- benchmark/buffers/buffer-read-float.js | 2 +- .../buffers/buffer-read-with-byteLength.js | 7 +++--- benchmark/buffers/buffer-read.js | 11 +++----- benchmark/buffers/buffer-slice.js | 4 +-- benchmark/buffers/buffer-swap.js | 4 +-- benchmark/buffers/buffer-tojson.js | 2 +- benchmark/buffers/buffer-tostring.js | 8 +++--- benchmark/buffers/buffer-write-string.js | 17 ++++++++----- benchmark/buffers/buffer-write.js | 7 +++--- benchmark/buffers/buffer-zero.js | 4 +-- 23 files changed, 80 insertions(+), 105 deletions(-) diff --git a/benchmark/buffers/buffer-bytelength.js b/benchmark/buffers/buffer-bytelength.js index 4caad3014455ca..90d43ec7f0262d 100644 --- a/benchmark/buffers/buffer-bytelength.js +++ b/benchmark/buffers/buffer-bytelength.js @@ -3,8 +3,8 @@ const common = require('../common'); const bench = common.createBenchmark(main, { encoding: ['utf8', 'base64', 'buffer'], - len: [1, 2, 4, 16, 64, 256], // x16 - n: [5e6] + len: [2, 16, 256], // x16 + n: [4e6] }); // 16 chars each diff --git a/benchmark/buffers/buffer-compare-instance-method.js b/benchmark/buffers/buffer-compare-instance-method.js index 77a3e84fa70344..284001c236d99d 100644 --- a/benchmark/buffers/buffer-compare-instance-method.js +++ b/benchmark/buffers/buffer-compare-instance-method.js @@ -2,8 +2,8 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - size: [16, 512, 1024, 4096, 16386], - args: [1, 2, 3, 4, 5], + size: [16, 512, 4096, 16386], + args: [1, 2, 5], n: [1e6] }); @@ -16,22 +16,6 @@ function main({ n, size, args }) { b1[size - 1] = 'b'.charCodeAt(0); - switch (args) { - case 2: - b0.compare(b1, 0); - break; - case 3: - b0.compare(b1, 0, b1Len); - break; - case 4: - b0.compare(b1, 0, b1Len, 0); - break; - case 5: - b0.compare(b1, 0, b1Len, 0, b0Len); - break; - default: - b0.compare(b1); - } switch (args) { case 2: b0.compare(b1, 0); diff --git a/benchmark/buffers/buffer-compare-offset.js b/benchmark/buffers/buffer-compare-offset.js index 89cc4427d9a24c..d08a312442395e 100644 --- a/benchmark/buffers/buffer-compare-offset.js +++ b/benchmark/buffers/buffer-compare-offset.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { method: ['offset', 'slice'], - size: [16, 512, 1024, 4096, 16386], + size: [16, 512, 4096, 16386], n: [1e6] }); diff --git a/benchmark/buffers/buffer-compare.js b/benchmark/buffers/buffer-compare.js index cb4f0f475c94ae..e6cf850da68af8 100644 --- a/benchmark/buffers/buffer-compare.js +++ b/benchmark/buffers/buffer-compare.js @@ -23,7 +23,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - size: [16, 512, 1024, 4096, 16386], + size: [16, 512, 4096, 16386], n: [1e6] }); diff --git a/benchmark/buffers/buffer-concat.js b/benchmark/buffers/buffer-concat.js index 3f9cffc06a6a7e..ced0f4ff31ce8d 100644 --- a/benchmark/buffers/buffer-concat.js +++ b/benchmark/buffers/buffer-concat.js @@ -2,20 +2,20 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - pieces: [1, 4, 16], + pieces: [4, 16], pieceSize: [1, 16, 256], withTotalLength: [0, 1], - n: [1024] + n: [8e5] }); function main({ n, pieces, pieceSize, withTotalLength }) { - const list = new Array(pieces); - list.fill(Buffer.allocUnsafe(pieceSize)); + const list = Array.from({ length: pieces }) + .fill(Buffer.allocUnsafe(pieceSize)); const totalLength = withTotalLength ? pieces * pieceSize : undefined; bench.start(); - for (var i = 0; i < n * 1024; i++) { + for (var i = 0; i < n; i++) { Buffer.concat(list, totalLength); } bench.end(n); diff --git a/benchmark/buffers/buffer-creation.js b/benchmark/buffers/buffer-creation.js index a7b340131eb8aa..38d80da915c070 100644 --- a/benchmark/buffers/buffer-creation.js +++ b/benchmark/buffers/buffer-creation.js @@ -1,5 +1,4 @@ 'use strict'; -const SlowBuffer = require('buffer').SlowBuffer; const common = require('../common.js'); const assert = require('assert'); @@ -9,10 +8,9 @@ const bench = common.createBenchmark(main, { 'fast-alloc-fill', 'fast-allocUnsafe', 'slow-allocUnsafe', - 'slow', - 'buffer()'], - len: [10, 1024, 2048, 4096, 8192], - n: [1024] + ], + len: [10, 1024, 4096, 8192], + n: [6e5] }); function main({ len, n, type }) { @@ -24,7 +22,7 @@ function main({ len, n, type }) { break; case 'fast-alloc-fill': bench.start(); - for (i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.alloc(len, 0); } bench.end(n); @@ -35,18 +33,12 @@ function main({ len, n, type }) { case 'slow-allocUnsafe': fn = Buffer.allocUnsafeSlow; break; - case 'slow': - fn = SlowBuffer; - break; - case 'buffer()': - fn = Buffer; - break; default: assert.fail('Should not get here'); } bench.start(); - for (i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { fn(len); } bench.end(n); diff --git a/benchmark/buffers/buffer-fill.js b/benchmark/buffers/buffer-fill.js index b497597fa1360b..02bc2a206c6fe3 100644 --- a/benchmark/buffers/buffer-fill.js +++ b/benchmark/buffers/buffer-fill.js @@ -14,7 +14,7 @@ const bench = common.createBenchmark(main, { 'fill("t", 0)', 'fill(Buffer.alloc(1), 0)', ], - size: [2 ** 8, 2 ** 13, 2 ** 16], + size: [2 ** 13, 2 ** 16], n: [2e4] }); diff --git a/benchmark/buffers/buffer-from.js b/benchmark/buffers/buffer-from.js index 437bf930f9fc61..1df1b5b362fefa 100644 --- a/benchmark/buffers/buffer-from.js +++ b/benchmark/buffers/buffer-from.js @@ -8,14 +8,13 @@ const bench = common.createBenchmark(main, { 'arraybuffer', 'arraybuffer-middle', 'buffer', - 'uint8array', 'string', 'string-utf8', 'string-base64', 'object', ], - len: [10, 2048], - n: [2048] + len: [100, 2048], + n: [8e5] }); function main({ len, n, source }) { @@ -26,17 +25,19 @@ function main({ len, n, source }) { const uint8array = new Uint8Array(len); const obj = { length: null }; // Results in a new, empty Buffer + let i = 0; + switch (source) { case 'array': bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(array); } bench.end(n); break; case 'arraybuffer': bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(arrayBuf); } bench.end(n); @@ -45,49 +46,49 @@ function main({ len, n, source }) { const offset = ~~(len / 4); const length = ~~(len / 2); bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(arrayBuf, offset, length); } bench.end(n); break; case 'buffer': bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(buffer); } bench.end(n); break; case 'uint8array': bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(uint8array); } bench.end(n); break; case 'string': bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(str); } bench.end(n); break; case 'string-utf8': bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(str, 'utf8'); } bench.end(n); break; case 'string-base64': bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(str, 'base64'); } bench.end(n); break; case 'object': bench.start(); - for (let i = 0; i < n * 1024; i++) { + for (i = 0; i < n; i++) { Buffer.from(obj); } bench.end(n); diff --git a/benchmark/buffers/buffer-hex.js b/benchmark/buffers/buffer-hex.js index 4d87313961aa67..1b49ca745381da 100644 --- a/benchmark/buffers/buffer-hex.js +++ b/benchmark/buffers/buffer-hex.js @@ -3,8 +3,8 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - len: [0, 1, 64, 1024], - n: [1e7] + len: [64, 1024], + n: [1e6] }); function main({ len, n }) { diff --git a/benchmark/buffers/buffer-indexof-number.js b/benchmark/buffers/buffer-indexof-number.js index 91bff0d54bb7eb..bd3fe34f4d7860 100644 --- a/benchmark/buffers/buffer-indexof-number.js +++ b/benchmark/buffers/buffer-indexof-number.js @@ -5,7 +5,7 @@ const path = require('path'); const bench = common.createBenchmark(main, { value: ['@'.charCodeAt(0)], - n: [1e7] + n: [1e6] }); function main({ n, value }) { @@ -13,9 +13,11 @@ function main({ n, value }) { path.resolve(__dirname, '../fixtures/alice.html') ); + let count = 0; bench.start(); for (var i = 0; i < n; i++) { - aliceBuffer.indexOf(value, 0, undefined); + count += aliceBuffer.indexOf(value, 0, undefined); } bench.end(n); + return count; } diff --git a/benchmark/buffers/buffer-indexof.js b/benchmark/buffers/buffer-indexof.js index f3b9dcf1fac5d8..cd083e8579395b 100644 --- a/benchmark/buffers/buffer-indexof.js +++ b/benchmark/buffers/buffer-indexof.js @@ -6,16 +6,12 @@ const path = require('path'); const searchStrings = [ '@', 'SQ', - '10x', '--l', 'Alice', 'Gryphon', - 'Panther', 'Ou est ma chatte?', 'found it very', - 'among mad people', 'neighbouring pool', - 'Soo--oop', 'aaaaaaaaaaaaaaaaa', 'venture to go near the house till she had brought herself down to', ' to the Caterpillar', @@ -23,9 +19,9 @@ const searchStrings = [ const bench = common.createBenchmark(main, { search: searchStrings, - encoding: ['undefined', 'utf8', 'ucs2', 'binary'], + encoding: ['utf8', 'ucs2'], type: ['buffer', 'string'], - n: [100000] + n: [5e4] }); function main({ n, search, encoding, type }) { diff --git a/benchmark/buffers/buffer-iterate.js b/benchmark/buffers/buffer-iterate.js index 7a275b0bcb8182..e81ce2b3035d90 100644 --- a/benchmark/buffers/buffer-iterate.js +++ b/benchmark/buffers/buffer-iterate.js @@ -4,8 +4,8 @@ const common = require('../common.js'); const assert = require('assert'); const bench = common.createBenchmark(main, { - size: [16, 512, 1024, 4096, 16386], - type: ['fast', 'slow'], + size: [512, 4096, 16386], + type: ['fast'], method: ['for', 'forOf', 'iterator'], n: [1e3] }); @@ -17,9 +17,10 @@ const methods = { }; function main({ size, type, method, n }) { - const clazz = type === 'fast' ? Buffer : SlowBuffer; - const buffer = new clazz(size); - buffer.fill(0); + const buffer = type === 'fast' ? + Buffer.alloc(size) : + SlowBuffer(size).fill(0); + const fn = methods[method || 'for']; bench.start(); @@ -46,7 +47,7 @@ function benchForOf(buffer, n) { function benchIterator(buffer, n) { for (var k = 0; k < n; k++) { const iter = buffer[Symbol.iterator](); - var cur = iter.next(); + let cur = iter.next(); while (!cur.done) { assert(cur.value === 0); diff --git a/benchmark/buffers/buffer-normalize-encoding.js b/benchmark/buffers/buffer-normalize-encoding.js index e33f7e0bc2ab47..1c743c83712ad2 100644 --- a/benchmark/buffers/buffer-normalize-encoding.js +++ b/benchmark/buffers/buffer-normalize-encoding.js @@ -5,23 +5,18 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { encoding: [ 'ascii', - 'ASCII', 'base64', 'BASE64', 'binary', - 'BINARY', 'hex', 'HEX', 'latin1', 'LATIN1', - 'ucs-2', 'UCS-2', - 'ucs2', 'UCS2', 'utf-16le', 'UTF-16LE', 'utf-8', - 'UTF-8', 'utf16le', 'UTF16LE', 'utf8', diff --git a/benchmark/buffers/buffer-read-float.js b/benchmark/buffers/buffer-read-float.js index dbccf57393f6f2..7589fbfc334d28 100644 --- a/benchmark/buffers/buffer-read-float.js +++ b/benchmark/buffers/buffer-read-float.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { type: ['Double', 'Float'], - endian: ['BE', 'LE'], + endian: ['LE'], value: ['zero', 'big', 'small', 'inf', 'nan'], n: [1e6] }); diff --git a/benchmark/buffers/buffer-read-with-byteLength.js b/benchmark/buffers/buffer-read-with-byteLength.js index 65d5f8f01ee73b..aea6344a82eb51 100644 --- a/benchmark/buffers/buffer-read-with-byteLength.js +++ b/benchmark/buffers/buffer-read-with-byteLength.js @@ -9,15 +9,16 @@ const types = [ ]; const bench = common.createBenchmark(main, { - buffer: ['fast', 'slow'], + buffer: ['fast'], type: types, n: [1e6], byteLength: [1, 2, 3, 4, 5, 6] }); function main({ n, buf, type, byteLength }) { - const clazz = buf === 'fast' ? Buffer : require('buffer').SlowBuffer; - const buff = new clazz(8); + const buff = buf === 'fast' ? + Buffer.alloc(8) : + require('buffer').SlowBuffer(8); const fn = `read${type || 'IntBE'}`; buff.writeDoubleLE(0, 0); diff --git a/benchmark/buffers/buffer-read.js b/benchmark/buffers/buffer-read.js index 06e2c6c70ebd3b..d407475ae4ed90 100644 --- a/benchmark/buffers/buffer-read.js +++ b/benchmark/buffers/buffer-read.js @@ -16,21 +16,18 @@ const types = [ 'Int16BE', 'Int32LE', 'Int32BE', - 'FloatLE', - 'FloatBE', - 'DoubleLE', - 'DoubleBE', ]; const bench = common.createBenchmark(main, { - buffer: ['fast', 'slow'], + buffer: ['fast'], type: types, n: [1e6] }); function main({ n, buf, type }) { - const clazz = buf === 'fast' ? Buffer : require('buffer').SlowBuffer; - const buff = new clazz(8); + const buff = buf === 'fast' ? + Buffer.alloc(8) : + require('buffer').SlowBuffer(8); const fn = `read${type || 'UInt8'}`; buff.writeDoubleLE(0, 0); diff --git a/benchmark/buffers/buffer-slice.js b/benchmark/buffers/buffer-slice.js index 2e52475da91866..82c960d56017cf 100644 --- a/benchmark/buffers/buffer-slice.js +++ b/benchmark/buffers/buffer-slice.js @@ -4,7 +4,7 @@ const SlowBuffer = require('buffer').SlowBuffer; const bench = common.createBenchmark(main, { type: ['fast', 'slow'], - n: [1024] + n: [1e6] }); const buf = Buffer.allocUnsafe(1024); @@ -13,7 +13,7 @@ const slowBuf = new SlowBuffer(1024); function main({ n, type }) { const b = type === 'fast' ? buf : slowBuf; bench.start(); - for (var i = 0; i < n * 1024; i++) { + for (var i = 0; i < n; i++) { b.slice(10, 256); } bench.end(n); diff --git a/benchmark/buffers/buffer-swap.js b/benchmark/buffers/buffer-swap.js index a85bcf32307313..0d3897ad8920f3 100644 --- a/benchmark/buffers/buffer-swap.js +++ b/benchmark/buffers/buffer-swap.js @@ -5,8 +5,8 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { aligned: ['true', 'false'], method: ['swap16', 'swap32', 'swap64'/* , 'htons', 'htonl', 'htonll' */], - len: [8, 64, 128, 256, 512, 768, 1024, 1536, 2056, 4096, 8192], - n: [5e7] + len: [64, 256, 768, 1024, 2056, 8192], + n: [1e6] }); // The htons and htonl methods below are used to benchmark the diff --git a/benchmark/buffers/buffer-tojson.js b/benchmark/buffers/buffer-tojson.js index 71936fb622eae6..d01a93ab5ed837 100644 --- a/benchmark/buffers/buffer-tojson.js +++ b/benchmark/buffers/buffer-tojson.js @@ -4,7 +4,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { n: [1e4], - len: [0, 10, 256, 4 * 1024] + len: [0, 256, 4 * 1024] }); function main({ n, len }) { diff --git a/benchmark/buffers/buffer-tostring.js b/benchmark/buffers/buffer-tostring.js index b2a14d8aec55ce..88543d8fd3af5a 100644 --- a/benchmark/buffers/buffer-tostring.js +++ b/benchmark/buffers/buffer-tostring.js @@ -3,10 +3,10 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - encoding: ['', 'utf8', 'ascii', 'latin1', 'binary', 'hex', 'UCS-2'], - args: [0, 1, 2, 3], - len: [0, 1, 64, 1024], - n: [1e7] + encoding: ['utf8', 'ascii', 'latin1', 'hex', 'UCS-2'], + args: [0, 1, 3], + len: [1, 64, 1024], + n: [1e6] }); function main({ encoding, args, len, n }) { diff --git a/benchmark/buffers/buffer-write-string.js b/benchmark/buffers/buffer-write-string.js index 6bd98ba4af9d87..b30edcf8867adf 100644 --- a/benchmark/buffers/buffer-write-string.js +++ b/benchmark/buffers/buffer-write-string.js @@ -3,36 +3,40 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { encoding: [ - '', 'utf8', 'ascii', 'hex', 'UCS-2', 'utf16le', 'latin1', 'binary', + '', 'utf8', 'ascii', 'hex', 'utf16le', 'latin1', ], args: [ '', 'offset', 'offset+length' ], - len: [10, 2048], - n: [1e7] + len: [2048], + n: [1e6] }); function main({ len, n, encoding, args }) { - const string = 'a'.repeat(len); + let string; + let start = 0; const buf = Buffer.allocUnsafe(len); var i; switch (args) { case 'offset': + string = 'a'.repeat(Math.floor(len / 2)); + start = len - string.length; if (encoding) { bench.start(); for (i = 0; i < n; ++i) { - buf.write(string, 0, encoding); + buf.write(string, start, encoding); } bench.end(n); } else { bench.start(); for (i = 0; i < n; ++i) { - buf.write(string, 0); + buf.write(string, start); } bench.end(n); } break; case 'offset+length': + string = 'a'.repeat(len); if (encoding) { bench.start(); for (i = 0; i < n; ++i) { @@ -48,6 +52,7 @@ function main({ len, n, encoding, args }) { } break; default: + string = 'a'.repeat(len); if (encoding) { bench.start(); for (i = 0; i < n; ++i) { diff --git a/benchmark/buffers/buffer-write.js b/benchmark/buffers/buffer-write.js index be5a6adc8ea3f8..02c0752feafb08 100644 --- a/benchmark/buffers/buffer-write.js +++ b/benchmark/buffers/buffer-write.js @@ -27,7 +27,7 @@ const types = [ ]; const bench = common.createBenchmark(main, { - buffer: ['fast', 'slow'], + buffer: ['fast'], type: types, n: [1e6] }); @@ -71,8 +71,9 @@ const byteLength = { }; function main({ n, buf, type }) { - const clazz = buf === 'fast' ? Buffer : require('buffer').SlowBuffer; - const buff = new clazz(8); + const buff = buf === 'fast' ? + Buffer.alloc(8) : + require('buffer').SlowBuffer(8); const fn = `write${type || 'UInt8'}`; if (!/\d/.test(fn)) diff --git a/benchmark/buffers/buffer-zero.js b/benchmark/buffers/buffer-zero.js index 1263732dce8e43..09792f038afd28 100644 --- a/benchmark/buffers/buffer-zero.js +++ b/benchmark/buffers/buffer-zero.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - n: [1024], + n: [1e6], type: ['buffer', 'string'] }); @@ -14,6 +14,6 @@ function main({ n, type }) { const data = type === 'buffer' ? zeroBuffer : zeroString; bench.start(); - for (var i = 0; i < n * 1024; i++) Buffer.from(data); + for (var i = 0; i < n; i++) Buffer.from(data); bench.end(n); }