From 86e0292733d6d08bf338b68fd50863aef17b1e44 Mon Sep 17 00:00:00 2001 From: ud2 Date: Thu, 27 Jun 2024 05:11:56 +0800 Subject: [PATCH] perf(ext/node): improve `Buffer.from(buffer)` (#24352) Benchmark code from #24341. ```shellsession $ deno run --allow-hrtime bench.mjs 6479.111583 $ target/release/deno run --allow-hrtime bench.mjs 962.753875 $ node bench.mjs 855.174875 ``` --- ext/node/polyfills/internal/buffer.mjs | 10 ++++------ tests/unit_node/buffer_test.ts | 11 +++++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ext/node/polyfills/internal/buffer.mjs b/ext/node/polyfills/internal/buffer.mjs index a051965a391fae..c3249455583f34 100644 --- a/ext/node/polyfills/internal/buffer.mjs +++ b/ext/node/polyfills/internal/buffer.mjs @@ -220,12 +220,9 @@ function fromString(string, encoding) { return buf; } -function fromArrayLike(array) { - const length = array.length < 0 ? 0 : checked(array.length) | 0; - const buf = createBuffer(length); - for (let i = 0; i < length; i += 1) { - buf[i] = array[i] & 255; - } +function fromArrayLike(obj) { + const buf = new Uint8Array(obj); + Object.setPrototypeOf(buf, Buffer.prototype); return buf; } @@ -234,6 +231,7 @@ function fromObject(obj) { if (typeof obj.length !== "number") { return createBuffer(0); } + return fromArrayLike(obj); } diff --git a/tests/unit_node/buffer_test.ts b/tests/unit_node/buffer_test.ts index 0005b1b5d3f380..07f5dd2c19b7db 100644 --- a/tests/unit_node/buffer_test.ts +++ b/tests/unit_node/buffer_test.ts @@ -534,15 +534,18 @@ Deno.test({ }); Deno.test({ - name: "[node/buffer] Buffer from another buffer creates a Buffer", + name: "[node/buffer] Buffer from another buffer creates a copy", fn() { - const buffer: Buffer = Buffer.from(Buffer.from("test")); - assertEquals(buffer.length, 4, "Buffer length should be 4"); + const buffer1: Buffer = Buffer.from("test"); + const buffer2: Buffer = Buffer.from(buffer1); + assertEquals(buffer2.length, 4, "Buffer length should be 4"); assertEquals( - buffer.toString(), + buffer2.toString(), "test", "Buffer to string should recover the string", ); + buffer1[0] = 114; + assertEquals(buffer2.toString(), "test", "Buffer should be a copy"); }, });