From d61861c2ea972fadd6e6b6bc62f5a8258e491ec4 Mon Sep 17 00:00:00 2001 From: lancanrong Date: Mon, 29 Sep 2025 16:34:22 +0800 Subject: [PATCH 1/3] feat: optimize atob and btoa performance --- packages/core-js/modules/web.atob.js | 6 +++--- packages/core-js/modules/web.btoa.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core-js/modules/web.atob.js b/packages/core-js/modules/web.atob.js index c3221c6647c0..1f6b31594e2d 100644 --- a/packages/core-js/modules/web.atob.js +++ b/packages/core-js/modules/web.atob.js @@ -47,7 +47,7 @@ $({ global: true, bind: true, enumerable: true, forced: FORCED }, { // `webpack` dev server bug on IE global methods - use call(fn, global, ...) if (BASIC && !NO_SPACES_IGNORE && !NO_ENCODING_CHECK) return call($atob, globalThis, data); var string = replace(toString(data), whitespaces, ''); - var output = ''; + var output = []; var position = 0; var bc = 0; var length, chr, bs; @@ -61,7 +61,7 @@ $({ global: true, bind: true, enumerable: true, forced: FORCED }, { while (position < length) { chr = charAt(string, position++); bs = bc % 4 ? bs * 64 + c2i[chr] : c2i[chr]; - if (bc++ % 4) output += fromCharCode(255 & bs >> (-2 * bc & 6)); - } return output; + if (bc++ % 4) output.push(fromCharCode(255 & bs >> (-2 * bc & 6))); + } return output.join(''); } }); diff --git a/packages/core-js/modules/web.btoa.js b/packages/core-js/modules/web.btoa.js index b8bda16c5b17..28f317e3f468 100644 --- a/packages/core-js/modules/web.btoa.js +++ b/packages/core-js/modules/web.btoa.js @@ -35,7 +35,7 @@ $({ global: true, bind: true, enumerable: true, forced: !BASIC || NO_ARG_RECEIVI // `webpack` dev server bug on IE global methods - use call(fn, global, ...) if (BASIC) return call($btoa, globalThis, toString(data)); var string = toString(data); - var output = ''; + var output = []; var position = 0; var map = i2c; var block, charCode; @@ -45,7 +45,7 @@ $({ global: true, bind: true, enumerable: true, forced: !BASIC || NO_ARG_RECEIVI throw new (getBuiltIn('DOMException'))('The string contains characters outside of the Latin1 range', 'InvalidCharacterError'); } block = block << 8 | charCode; - output += charAt(map, 63 & block >> 8 - position % 1 * 8); - } return output; + output.push(charAt(map, 63 & block >> 8 - position % 1 * 8)); + } return output.join(''); } }); From 9be5d63f1041da030c3b7cc0a966bb06b385ef58 Mon Sep 17 00:00:00 2001 From: lancanrong Date: Sat, 11 Oct 2025 15:13:02 +0800 Subject: [PATCH 2/3] feat: pre-allocating array --- packages/core-js/modules/web.atob.js | 4 +++- packages/core-js/modules/web.btoa.js | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/core-js/modules/web.atob.js b/packages/core-js/modules/web.atob.js index 1f6b31594e2d..ebdd22a8e335 100644 --- a/packages/core-js/modules/web.atob.js +++ b/packages/core-js/modules/web.atob.js @@ -1,5 +1,6 @@ 'use strict'; var $ = require('../internals/export'); +var arrayFrom = require('../internals/array-from'); var globalThis = require('../internals/global-this'); var getBuiltIn = require('../internals/get-built-in'); var uncurryThis = require('../internals/function-uncurry-this'); @@ -47,7 +48,8 @@ $({ global: true, bind: true, enumerable: true, forced: FORCED }, { // `webpack` dev server bug on IE global methods - use call(fn, global, ...) if (BASIC && !NO_SPACES_IGNORE && !NO_ENCODING_CHECK) return call($atob, globalThis, data); var string = replace(toString(data), whitespaces, ''); - var output = []; + // every 4 characters produce 3 bytes, so ceil(length * 3 / 4) is the number of bytes + var output = arrayFrom({ length: Math.ceil(string.length * 3 / 4) }); var position = 0; var bc = 0; var length, chr, bs; diff --git a/packages/core-js/modules/web.btoa.js b/packages/core-js/modules/web.btoa.js index 28f317e3f468..38b5284209e8 100644 --- a/packages/core-js/modules/web.btoa.js +++ b/packages/core-js/modules/web.btoa.js @@ -1,5 +1,6 @@ 'use strict'; var $ = require('../internals/export'); +var arrayFrom = require('../internals/array-from'); var globalThis = require('../internals/global-this'); var getBuiltIn = require('../internals/get-built-in'); var uncurryThis = require('../internals/function-uncurry-this'); @@ -35,7 +36,8 @@ $({ global: true, bind: true, enumerable: true, forced: !BASIC || NO_ARG_RECEIVI // `webpack` dev server bug on IE global methods - use call(fn, global, ...) if (BASIC) return call($btoa, globalThis, toString(data)); var string = toString(data); - var output = []; + // every 3 characters produce 4 bytes, so ceil(length * 4 / 3) is the number of bytes + var output = arrayFrom({ length: Math.ceil(string.length * 4 / 3) }); var position = 0; var map = i2c; var block, charCode; From e82471a8f677955b30ef7a082bd86e557bbdccef Mon Sep 17 00:00:00 2001 From: lancanrong Date: Sat, 11 Oct 2025 17:00:17 +0800 Subject: [PATCH 3/3] Revert "feat: pre-allocating array" This reverts commit 9be5d63f1041da030c3b7cc0a966bb06b385ef58. --- packages/core-js/modules/web.atob.js | 4 +--- packages/core-js/modules/web.btoa.js | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/core-js/modules/web.atob.js b/packages/core-js/modules/web.atob.js index ebdd22a8e335..1f6b31594e2d 100644 --- a/packages/core-js/modules/web.atob.js +++ b/packages/core-js/modules/web.atob.js @@ -1,6 +1,5 @@ 'use strict'; var $ = require('../internals/export'); -var arrayFrom = require('../internals/array-from'); var globalThis = require('../internals/global-this'); var getBuiltIn = require('../internals/get-built-in'); var uncurryThis = require('../internals/function-uncurry-this'); @@ -48,8 +47,7 @@ $({ global: true, bind: true, enumerable: true, forced: FORCED }, { // `webpack` dev server bug on IE global methods - use call(fn, global, ...) if (BASIC && !NO_SPACES_IGNORE && !NO_ENCODING_CHECK) return call($atob, globalThis, data); var string = replace(toString(data), whitespaces, ''); - // every 4 characters produce 3 bytes, so ceil(length * 3 / 4) is the number of bytes - var output = arrayFrom({ length: Math.ceil(string.length * 3 / 4) }); + var output = []; var position = 0; var bc = 0; var length, chr, bs; diff --git a/packages/core-js/modules/web.btoa.js b/packages/core-js/modules/web.btoa.js index 38b5284209e8..28f317e3f468 100644 --- a/packages/core-js/modules/web.btoa.js +++ b/packages/core-js/modules/web.btoa.js @@ -1,6 +1,5 @@ 'use strict'; var $ = require('../internals/export'); -var arrayFrom = require('../internals/array-from'); var globalThis = require('../internals/global-this'); var getBuiltIn = require('../internals/get-built-in'); var uncurryThis = require('../internals/function-uncurry-this'); @@ -36,8 +35,7 @@ $({ global: true, bind: true, enumerable: true, forced: !BASIC || NO_ARG_RECEIVI // `webpack` dev server bug on IE global methods - use call(fn, global, ...) if (BASIC) return call($btoa, globalThis, toString(data)); var string = toString(data); - // every 3 characters produce 4 bytes, so ceil(length * 4 / 3) is the number of bytes - var output = arrayFrom({ length: Math.ceil(string.length * 4 / 3) }); + var output = []; var position = 0; var map = i2c; var block, charCode;