Skip to content
Permalink
Browse files

buffer: improve performance caused by primordials

This is my first PR, and it's based on the code-and-learn guidances
This restore some performance after introducing primordialias.

Refs: #29766
Refs: nodejs/code-and-learn#97
Refs: #29633

PR-URL: #30235
Refs: #29766
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
  • Loading branch information
jizusun authored and targos committed Nov 3, 2019
1 parent b1529c6 commit 680e9cc7e13b64e1e45fdb9b8a3f843585d9e1fd
Showing with 26 additions and 14 deletions.
  1. +26 −14 lib/buffer.js
@@ -21,7 +21,19 @@

'use strict';

const { Math, Object } = primordials;
const {
Object: {
defineProperties: ObjectDefineProperties,
defineProperty: ObjectDefineProperty,
setPrototypeOf: ObjectSetPrototypeOf,
create: ObjectCreate
},
Math: {
floor: MathFloor,
trunc: MathTrunc,
min: MathMin
}
} = primordials;

const {
byteLengthUtf8,
@@ -89,7 +101,7 @@ FastBuffer.prototype.constructor = Buffer;
Buffer.prototype = FastBuffer.prototype;
addBufferPrototypeMethods(Buffer.prototype);

const constants = Object.defineProperties({}, {
const constants = ObjectDefineProperties({}, {
MAX_LENGTH: {
value: kMaxLength,
writable: false,
@@ -111,7 +123,7 @@ let poolSize, poolOffset, allocPool;
// do not own the ArrayBuffer allocator. Zero fill is always on in that case.
const zeroFill = bindingZeroFill || [0];

const encodingsMap = Object.create(null);
const encodingsMap = ObjectCreate(null);
for (let i = 0; i < encodings.length; ++i)
encodingsMap[encodings[i]] = i;

@@ -168,7 +180,7 @@ function toInteger(n, defaultVal) {
if (!Number.isNaN(n) &&
n >= Number.MIN_SAFE_INTEGER &&
n <= Number.MAX_SAFE_INTEGER) {
return ((n % 1) === 0 ? n : Math.floor(n));
return ((n % 1) === 0 ? n : MathFloor(n));
}
return defaultVal;
}
@@ -253,7 +265,7 @@ function Buffer(arg, encodingOrOffset, length) {
return Buffer.from(arg, encodingOrOffset, length);
}

Object.defineProperty(Buffer, Symbol.species, {
ObjectDefineProperty(Buffer, Symbol.species, {
enumerable: false,
configurable: true,
get() { return FastBuffer; }
@@ -311,7 +323,7 @@ const of = (...items) => {
};
Buffer.of = of;

Object.setPrototypeOf(Buffer, Uint8Array);
ObjectSetPrototypeOf(Buffer, Uint8Array);

// The 'assertSize' method will remove itself from the callstack when an error
// occurs. This is done simply to keep the internal details of the
@@ -364,8 +376,8 @@ function SlowBuffer(length) {
return createUnsafeBuffer(length);
}

Object.setPrototypeOf(SlowBuffer.prototype, Uint8Array.prototype);
Object.setPrototypeOf(SlowBuffer, Uint8Array);
ObjectSetPrototypeOf(SlowBuffer.prototype, Uint8Array.prototype);
ObjectSetPrototypeOf(SlowBuffer, Uint8Array);

function allocate(size) {
if (size <= 0) {
@@ -712,15 +724,15 @@ function byteLength(string, encoding) {
Buffer.byteLength = byteLength;

// For backwards compatibility.
Object.defineProperty(Buffer.prototype, 'parent', {
ObjectDefineProperty(Buffer.prototype, 'parent', {
enumerable: true,
get() {
if (!(this instanceof Buffer))
return undefined;
return this.buffer;
}
});
Object.defineProperty(Buffer.prototype, 'offset', {
ObjectDefineProperty(Buffer.prototype, 'offset', {
enumerable: true,
get() {
if (!(this instanceof Buffer))
@@ -789,7 +801,7 @@ let INSPECT_MAX_BYTES = 50;
// Override how buffers are presented by util.inspect().
Buffer.prototype[customInspectSymbol] = function inspect(recurseTimes, ctx) {
const max = INSPECT_MAX_BYTES;
const actualMax = Math.min(max, this.length);
const actualMax = MathMin(max, this.length);
const remaining = this.length - max;
let str = this.hexSlice(0, actualMax).replace(/(.{2})/g, '$1 ').trim();
if (remaining > 0)
@@ -802,7 +814,7 @@ Buffer.prototype[customInspectSymbol] = function inspect(recurseTimes, ctx) {
extras = true;
obj[key] = this[key];
return obj;
}, Object.create(null));
}, ObjectCreate(null));
if (extras) {
if (this.length !== 0)
str += ', ';
@@ -1042,7 +1054,7 @@ Buffer.prototype.toJSON = function toJSON() {
function adjustOffset(offset, length) {
// Use Math.trunc() to convert offset to an integer value that can be larger
// than an Int32. Hence, don't use offset | 0 or similar techniques.
offset = Math.trunc(offset);
offset = MathTrunc(offset);
if (offset === 0) {
return 0;
}
@@ -1163,7 +1175,7 @@ module.exports = {
kStringMaxLength
};

Object.defineProperties(module.exports, {
ObjectDefineProperties(module.exports, {
constants: {
configurable: false,
enumerable: true,

0 comments on commit 680e9cc

Please sign in to comment.
You can’t perform that action at this time.