lib: reduce overhead of blob clone

PR-URL: https://github.com/nodejs/node/pull/50110
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Stephen Belanger <admin@stephenbelanger.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
This commit is contained in:
Vinicius Lourenço 2023-10-17 03:23:40 -03:00 committed by GitHub
parent ea595ebbf2
commit badba8ceb6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 16 deletions

View File

@ -7,14 +7,17 @@ const assert = require('assert');
const bench = common.createBenchmark(main, {
n: [50e3],
bytes: [128, 1024, 1024 ** 2],
});
let _cloneResult;
function main({ n }) {
function main({ n, bytes }) {
const buff = Buffer.allocUnsafe(bytes);
const blob = new Blob(buff);
bench.start();
for (let i = 0; i < n; ++i)
_cloneResult = structuredClone(new Blob(['hello']));
_cloneResult = structuredClone(blob);
bench.end(n);
// Avoid V8 deadcode (elimination)

View File

@ -8,7 +8,6 @@ const {
ObjectDefineProperty,
ObjectSetPrototypeOf,
PromiseReject,
ReflectConstruct,
RegExpPrototypeExec,
RegExpPrototypeSymbolReplace,
StringPrototypeToLowerCase,
@ -200,7 +199,7 @@ class Blob {
const length = this[kLength];
return {
data: { handle, type, length },
deserializeInfo: 'internal/blob:ClonedBlob',
deserializeInfo: 'internal/blob:Blob',
};
}
@ -397,25 +396,18 @@ class Blob {
}
}
function ClonedBlob() {
return ReflectConstruct(function() {
markTransferMode(this, true, false);
}, [], Blob);
}
ClonedBlob.prototype[kDeserialize] = () => {};
function TransferrableBlob(handle, length, type = '') {
function TransferableBlob(handle, length, type = '') {
markTransferMode(this, true, false);
this[kHandle] = handle;
this[kType] = type;
this[kLength] = length;
}
ObjectSetPrototypeOf(TransferrableBlob.prototype, Blob.prototype);
ObjectSetPrototypeOf(TransferrableBlob, Blob);
ObjectSetPrototypeOf(TransferableBlob.prototype, Blob.prototype);
ObjectSetPrototypeOf(TransferableBlob, Blob);
function createBlob(handle, length, type = '') {
const transferredBlob = new TransferrableBlob(handle, length, type);
const transferredBlob = new TransferableBlob(handle, length, type);
// Fix issues like: https://github.com/nodejs/node/pull/49730#discussion_r1331720053
transferredBlob.constructor = Blob;
@ -489,7 +481,6 @@ function createBlobFromFilePath(path, options) {
module.exports = {
Blob,
ClonedBlob,
createBlob,
createBlobFromFilePath,
isBlob,

View File

@ -480,3 +480,13 @@ assert.throws(() => new Blob({}), {
assert.ok(blob.slice(0, 1).constructor === Blob);
assert.ok(blob.slice(0, 1) instanceof Blob);
}
(async () => {
const blob = new Blob(['hello']);
assert.ok(structuredClone(blob).constructor === Blob);
assert.ok(structuredClone(blob) instanceof Blob);
assert.ok(structuredClone(blob).size === blob.size);
assert.ok(structuredClone(blob).size === blob.size);
assert.ok((await structuredClone(blob).text()) === (await blob.text()));
})().then(common.mustCall());