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:
parent
bfa4ed92bc
commit
7044bf523b
2 changed files with 20 additions and 12 deletions
|
@ -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();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue