From 2da35e4257400b6184158f652b0f3e772e93cc20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=AE=E7=94=9F=EF=BC=88=E5=AD=90=E8=99=9A=EF=BC=89?= <2234839456@qq.com> Date: Thu, 23 Jul 2026 17:16:45 +0800 Subject: [PATCH] =?UTF-8?q?perf(gsub):=20emitCoverage=20=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E5=86=97=E4=BD=99=E7=9A=84=20new=20Set=20=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit emitCoverage 原用 Array.from(new Set(newGids)).sort() 去重+排序。 但所有调用方传入的 newGids 逻辑上保证无重复: - readCoverageRemapped 按原 coverage(规范要求 gid 唯一)升序过滤,每个原 gid 映射唯一新 gid - entries.map(e=>e.from) 的 from 是 entry 主键(唯一) 实测 FiraCode 单次子集化 327 次 emitCoverage 调用 0 次发现重复, new Set 去重纯属 GC 开销(Set 构造+迭代+Array.from)。 改为 newGids.slice().sort(),消除 Set 分配。sort 保留(新 gid 随原 gid 非单调,需排序)。 验证:与优化前字节逐字节一致(cmp 通过,8724==8724), pnpx tsx 基准测试.test.ts 全部 SSIM 无回归。 Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/font_util/gsub-subset.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/backend/font_util/gsub-subset.ts b/backend/font_util/gsub-subset.ts index 70b62a2..8464ce6 100644 --- a/backend/font_util/gsub-subset.ts +++ b/backend/font_util/gsub-subset.ts @@ -225,8 +225,13 @@ function readCoverageRemapped( * 自动选择 format1(列表)或 format2(区间)中更紧凑的。 */ function emitCoverage(w: Writer, newGids: number[]): number { - /** 去重并升序(Coverage 要求升序且唯一) */ - const sorted = Array.from(new Set(newGids)).sort((a, b) => a - b); + /** 升序(Coverage 要求升序)。 + * 无需去重:所有调用方传入的 newGids 逻辑上保证无重复—— + * readCoverageRemapped 按原 coverage(规范要求 gid 唯一)升序过滤,每个原 gid 映射唯一新 gid; + * entries.map(e=>e.from) 的 from 是 entry 主键(唯一)。 + * 实测 FiraCode 单次子集化 327 次 emitCoverage 调用 0 次发现重复,去重(new Set)纯为 GC 开销。 + * slice 复制后原地排序,避免修改调用方的数组。 */ + const sorted = newGids.slice().sort((a, b) => a - b); const off = w.length; let ranges: Array<{ start: number; end: number }> = []; for (let i = 0; i < sorted.length; ) {