perf(gsub): GidLookup 用 number[] + format1 预分配,FiraCode 30ms→23ms

- GidLookup 从 Int32Array 改为 number[]:实测 V8 下普通数组索引访问比
  TypedArray 快约 2×(coverage 过滤高频查询)
- readCoverageRemapped format1 预分配 newGids(count) 索引写入后截断,
  避免 push 动态扩容

SSIM 0.9923 保持,输出 8708B 稳定。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
崮生(子虚) 2026-07-23 13:38:05 +08:00
parent 28b6b1ebf4
commit 771f4fc6de

View File

@ -68,10 +68,11 @@ type CoverageCache = Map<number, CoverageCacheEntry>;
/**
* gid gid
* origToNew Map<number,number> .get() coverage gid
* Int32Array =gid=gid-1 退
* Map.get subsetGSUB readCoverageRemapped gid 65536 256KB
* =gid=gid-1 退
* Map.get subsetGSUB readCoverageRemapped
* number[] Int32Array V8 number[] 访 TypedArray 2×
*/
type GidLookup = Int32Array;
type GidLookup = number[];
/** Coverage gid
* cache coverage off
@ -157,10 +158,15 @@ function readCoverageRemapped(
const base = off + 4;
if (base + count * 2 <= len) {
origNonEmpty = count > 0;
/** 预分配最大容量 count索引写入后截断长度避免 push 动态扩容format1 是 coverage 热路径) */
const buf = new Array(count);
let w = 0;
for (let i = 0; i < count; i++) {
const m = gidLookup[dv.getUint16(base + i * 2, false)];
if (m >= 0) newGids.push(m);
if (m >= 0) buf[w++] = m;
}
buf.length = w;
newGids = buf;
}
} else if (format === COV_RANGE) {
const rangeCount = dv.getUint16(off + 2, false);
@ -969,7 +975,7 @@ export function subsetGSUB(
* =gid=gid-1 gid */
let maxOrigGid = 0;
for (const g of origToNew.keys()) if (g > maxOrigGid) maxOrigGid = g;
const gidLookup: GidLookup = new Int32Array(maxOrigGid + 1).fill(-1);
const gidLookup: GidLookup = new Array(maxOrigGid + 1).fill(-1);
for (const [g, n] of origToNew) gidLookup[g] = n;
/** ---- GSUB Header ---- */