mirror of
https://github.com/nodejs/node.git
synced 2025-05-12 14:37:22 +00:00

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 <matteo.collina@gmail.com> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com> Reviewed-By: Peter Marshall <petermarshall@chromium.org> Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
84 lines
2.1 KiB
JavaScript
84 lines
2.1 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common.js');
|
|
|
|
const bench = common.createBenchmark(main, {
|
|
aligned: ['true', 'false'],
|
|
method: ['swap16', 'swap32', 'swap64'/* , 'htons', 'htonl', 'htonll' */],
|
|
len: [64, 256, 768, 1024, 2056, 8192],
|
|
n: [1e6]
|
|
});
|
|
|
|
// The htons and htonl methods below are used to benchmark the
|
|
// performance difference between doing the byteswap in pure
|
|
// javascript regardless of Buffer size as opposed to dropping
|
|
// down to the native layer for larger Buffer sizes. Commented
|
|
// out by default because they are slow for big buffers. If
|
|
// re-evaluating the crossover point, uncomment those methods
|
|
// and comment out their implementations in lib/buffer.js so
|
|
// C++ version will always be used.
|
|
|
|
function swap(b, n, m) {
|
|
const i = b[n];
|
|
b[n] = b[m];
|
|
b[m] = i;
|
|
}
|
|
|
|
Buffer.prototype.htons = function htons() {
|
|
if (this.length % 2 !== 0)
|
|
throw new RangeError();
|
|
for (var i = 0; i < this.length; i += 2) {
|
|
swap(this, i, i + 1);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
Buffer.prototype.htonl = function htonl() {
|
|
if (this.length % 4 !== 0)
|
|
throw new RangeError();
|
|
for (var i = 0; i < this.length; i += 4) {
|
|
swap(this, i, i + 3);
|
|
swap(this, i + 1, i + 2);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
Buffer.prototype.htonll = function htonll() {
|
|
if (this.length % 8 !== 0)
|
|
throw new RangeError();
|
|
for (var i = 0; i < this.length; i += 8) {
|
|
swap(this, i, i + 7);
|
|
swap(this, i + 1, i + 6);
|
|
swap(this, i + 2, i + 5);
|
|
swap(this, i + 3, i + 4);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
function createBuffer(len, aligned) {
|
|
len += aligned ? 0 : 1;
|
|
const buf = Buffer.allocUnsafe(len);
|
|
for (var i = 1; i <= len; i++)
|
|
buf[i - 1] = i;
|
|
return aligned ? buf : buf.slice(1);
|
|
}
|
|
|
|
function genMethod(method) {
|
|
const fnString = `
|
|
return function ${method}(n, buf) {
|
|
for (var i = 0; i <= n; i++)
|
|
buf.${method}();
|
|
}`;
|
|
return (new Function(fnString))();
|
|
}
|
|
|
|
function main({ method, len, n, aligned = 'true' }) {
|
|
const buf = createBuffer(len, aligned === 'true');
|
|
const bufferSwap = genMethod(method || 'swap16');
|
|
|
|
bufferSwap(n, buf);
|
|
bench.start();
|
|
bufferSwap(n, buf);
|
|
bench.end(n);
|
|
}
|