mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-06-12 20:41:24 +00:00
Optimise encodeInto reallocations
Instead of doubling the size on each iteration, use precise upper limit (3 * JS length) if the string turned out not to be ASCII-only. This results in maximum of 1 reallocation instead of O(log N). Some dummy examples of what this would change: - 1000 of ASCII chars: no change, allocates 1000 bytes and bails out. - 1000 ASCII chars + 1 '😃': before allocated 1000 bytes and reallocated to 2000; now allocates 1000 bytes and reallocates to 1006. - 1000 of '😃' chars: before allocated 1000 bytes, reallocated to 2000, finally reallocated again to 4000; now allocates 1000 bytes and reallocates to 4000 right away. Related issue: #1313
This commit is contained in:
@ -1306,13 +1306,12 @@ impl<'a> Context<'a> {
|
|||||||
while (true) {{
|
while (true) {{
|
||||||
const view = getUint8Memory().subarray(ptr + writeOffset, ptr + size);
|
const view = getUint8Memory().subarray(ptr + writeOffset, ptr + size);
|
||||||
const {{ read, written }} = cachedTextEncoder.encodeInto(arg, view);
|
const {{ read, written }} = cachedTextEncoder.encodeInto(arg, view);
|
||||||
arg = arg.substring(read);
|
if (read === arg.length) {{
|
||||||
writeOffset += written;
|
|
||||||
if (arg.length === 0) {{
|
|
||||||
break;
|
break;
|
||||||
}}
|
}}
|
||||||
ptr = wasm.__wbindgen_realloc(ptr, size, size * 2);
|
arg = arg.substring(read);
|
||||||
size *= 2;
|
writeOffset += written;
|
||||||
|
ptr = wasm.__wbindgen_realloc(ptr, size, size += arg.length * 3);
|
||||||
}}
|
}}
|
||||||
WASM_VECTOR_LEN = writeOffset;
|
WASM_VECTOR_LEN = writeOffset;
|
||||||
return ptr;
|
return ptr;
|
||||||
|
Reference in New Issue
Block a user