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
```
This commit is contained in:
ud2 2024-06-27 05:11:56 +08:00 committed by GitHub
parent 77ba0019e7
commit 86e0292733
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 10 deletions

View file

@ -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);
}

View file

@ -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");
},
});