0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 17:34:47 -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() { function benchB64RtLong() {
const input = "long-string".repeat(99999); const input = "long-string".repeat(99999);
benchSync("b64_rt_long", 1e2, () => { benchSync("b64_rt_long", 100, () => {
atob(btoa(input)); atob(btoa(input));
}); });
} }
@ -58,7 +58,7 @@ function benchUrlParse() {
function benchLargeBlobText() { function benchLargeBlobText() {
const input = "long-string".repeat(999_999); const input = "long-string".repeat(999_999);
benchSync("blob_text_large", 3, () => { benchSync("blob_text_large", 100, () => {
new Blob([input]).text(); new Blob([input]).text();
}); });
} }

View file

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