1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

perf(web): optimize Blob.text and Blob.arrayBuffer (#13981)

This commit is contained in:
Divy Srivastava 2022-03-16 19:16:52 +05:30 committed by GitHub
parent bfa4ed92bc
commit 7044bf523b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 12 deletions

View file

@ -39,7 +39,7 @@ function benchStats(name, n, t1, t2) {
function benchB64RtLong() {
const input = "long-string".repeat(99999);
benchSync("b64_rt_long", 1e2, () => {
benchSync("b64_rt_long", 100, () => {
atob(btoa(input));
});
}
@ -58,7 +58,7 @@ function benchUrlParse() {
function benchLargeBlobText() {
const input = "long-string".repeat(999_999);
benchSync("blob_text_large", 3, () => {
benchSync("blob_text_large", 100, () => {
new Blob([input]).text();
});
}

View file

@ -340,8 +340,22 @@
*/
async text() {
webidl.assertBranded(this, BlobPrototype);
const buffer = await this.arrayBuffer();
return core.decode(new Uint8Array(buffer));
const buffer = await this.#u8Array(this.size);
return core.decode(buffer);
}
async #u8Array(size) {
const bytes = new Uint8Array(size);
const partIterator = toIterator(this[_parts]);
let offset = 0;
for await (const chunk of partIterator) {
const byteLength = chunk.byteLength;
if (byteLength > 0) {
TypedArrayPrototypeSet(bytes, chunk, offset);
offset += byteLength;
}
}
return bytes;
}
/**
@ -349,14 +363,8 @@
*/
async arrayBuffer() {
webidl.assertBranded(this, BlobPrototype);
const stream = this.stream();
const bytes = new Uint8Array(this.size);
let offset = 0;
for await (const chunk of stream) {
TypedArrayPrototypeSet(bytes, chunk, offset);
offset += chunk.byteLength;
}
return bytes.buffer;
const buf = await this.#u8Array(this.size);
return buf.buffer;
}
[SymbolFor("Deno.customInspect")](inspect) {