From 04166fe2fa7e23dc53f0ed2170f7c5aa9d565b04 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Sat, 11 Feb 2023 17:48:17 +0100 Subject: [PATCH] benchmark: split `Buffer.byteLength` benchmark PR-URL: https://github.com/nodejs/node/pull/46616 Reviewed-By: Anna Henningsen Reviewed-By: Robert Nagy Reviewed-By: Yagiz Nizipli Reviewed-By: James M Snell --- benchmark/buffers/buffer-bytelength-buffer.js | 22 +++++++++ benchmark/buffers/buffer-bytelength-string.js | 40 +++++++++++++++ benchmark/buffers/buffer-bytelength.js | 49 ------------------- 3 files changed, 62 insertions(+), 49 deletions(-) create mode 100644 benchmark/buffers/buffer-bytelength-buffer.js create mode 100644 benchmark/buffers/buffer-bytelength-string.js delete mode 100644 benchmark/buffers/buffer-bytelength.js diff --git a/benchmark/buffers/buffer-bytelength-buffer.js b/benchmark/buffers/buffer-bytelength-buffer.js new file mode 100644 index 00000000000000..756a6b8db73b42 --- /dev/null +++ b/benchmark/buffers/buffer-bytelength-buffer.js @@ -0,0 +1,22 @@ +'use strict'; +const common = require('../common'); + +const bench = common.createBenchmark(main, { + len: [2, 16, 256], // x16 + n: [4e6], +}); + +function main({ n, len }) { + const data = Buffer.alloc(len * 16, 'a'); + const expected = Buffer.byteLength(data, 'buffer'); + let changed = false; + bench.start(); + for (let i = 0; i < n; i++) { + const actual = Buffer.byteLength(data, 'buffer'); + if (expected !== actual) { changed = true; } + } + bench.end(n); + if (changed) { + throw new Error('Result changed during iteration'); + } +} diff --git a/benchmark/buffers/buffer-bytelength-string.js b/benchmark/buffers/buffer-bytelength-string.js new file mode 100644 index 00000000000000..fc0c005e7f9e6a --- /dev/null +++ b/benchmark/buffers/buffer-bytelength-string.js @@ -0,0 +1,40 @@ +'use strict'; +const common = require('../common'); + +const bench = common.createBenchmark(main, { + type: ['one_byte', 'two_bytes', 'three_bytes', 'four_bytes'], + encoding: ['utf8', 'base64'], + repeat: [1, 2, 16, 256], // x16 + n: [4e6], +}); + +// 16 chars each +const chars = { + one_byte: 'hello brendan!!!', + two_bytes: 'ΰαβγδεζηθικλμνξο', + three_bytes: '挰挱挲挳挴挵挶挷挸挹挺挻挼挽挾挿', + four_bytes: '𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢', +}; + +function getInput(type, repeat, encoding) { + const original = (repeat === 1) ? chars[type] : chars[type].repeat(repeat); + if (encoding === 'base64') { + Buffer.from(original, 'utf8').toString('base64'); + } + return original; +} + +function main({ n, repeat, encoding, type }) { + const data = getInput(type, repeat, encoding); + const expected = Buffer.byteLength(data, encoding); + let changed = false; + bench.start(); + for (let i = 0; i < n; i++) { + const actual = Buffer.byteLength(data, encoding); + if (expected !== actual) { changed = true; } + } + bench.end(n); + if (changed) { + throw new Error('Result changed during iteration'); + } +} diff --git a/benchmark/buffers/buffer-bytelength.js b/benchmark/buffers/buffer-bytelength.js deleted file mode 100644 index 0f24df0111342f..00000000000000 --- a/benchmark/buffers/buffer-bytelength.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; -const common = require('../common'); - -const bench = common.createBenchmark(main, { - encoding: ['utf8', 'base64', 'buffer'], - len: [2, 16, 256], // x16 - n: [4e6], -}); - -// 16 chars each -const chars = [ - 'hello brendan!!!', // 1 byte - 'ΰαβγδεζηθικλμνξο', // 2 bytes - '挰挱挲挳挴挵挶挷挸挹挺挻挼挽挾挿', // 3 bytes - '𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢', // 4 bytes -]; - -function main({ n, len, encoding }) { - let strings = []; - let results = [len * 16]; - if (encoding === 'buffer') { - strings = [Buffer.alloc(len * 16, 'a')]; - } else { - for (const string of chars) { - // Strings must be built differently, depending on encoding - const data = string.repeat(len); - if (encoding === 'utf8') { - strings.push(data); - } else if (encoding === 'base64') { - // Base64 strings will be much longer than their UTF8 counterparts - strings.push(Buffer.from(data, 'utf8').toString('base64')); - } - } - - // Check the result to ensure it is *properly* optimized - results = strings.map((val) => Buffer.byteLength(val, encoding)); - } - - bench.start(); - for (let i = 0; i < n; i++) { - const index = n % strings.length; - // Go! - const r = Buffer.byteLength(strings[index], encoding); - - if (r !== results[index]) - throw new Error('incorrect return value'); - } - bench.end(n); -}