perf(gsub-reachable): collectChainRuleRefs 循环内 r.u16 改 dv.getUint16

chain format1 规则的 backtrack/input/lookahead/substRecords 读取(6 个内层
循环)从 r.u16 改 dv.getUint16。FiraCode 180 个 fmt1 规则 × 多次密集调用。
count 读取(backtrackCount 等)保留 r.u16 维持原行为。

FiraCode reachable 集合 size=89 不变,5 字体 sha 逐字节一致,SSIM 全不变。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
崮生(子虚) 2026-07-24 19:44:08 +08:00
parent 7719110b32
commit 77029f1090

View File

@ -543,6 +543,8 @@ function collectChainRuleRefs(
isGidFormat: boolean,
): void {
/** format1/2 rule: backtrackCount + backtrack[] + inputCount + input[] + lookaheadCount + lookahead[] + substCount + substRecords[] */
/** 缓存 dvchain format1 规则密集调用FiraCode 180 fmt1 规则 × 6+ 次 u16直接 getUint16 省方法调用+边界检查 */
const dv = r.dv;
let p = ruleOff;
const backtrackCount = r.u16(p); p += 2;
const backtrackEnd = p + backtrackCount * 2;
@ -559,26 +561,26 @@ function collectChainRuleRefs(
/** 第一遍:校验 backtrack + input + lookahead 全部 gid 在子集(遇子集外即放弃规则) */
let q = ruleOff + 2;
for (let k = 0; k < backtrackCount; k++) {
if (!inSubset(r.u16(q + k * 2))) return;
if (!inSubset(dv.getUint16(q + k * 2, false))) return;
}
q += backtrackCount * 2 + 2;
for (let k = 0; k < inputLen; k++) {
if (!inSubset(r.u16(q + k * 2))) return;
if (!inSubset(dv.getUint16(q + k * 2, false))) return;
}
q += inputLen * 2 + 2;
for (let k = 0; k < lookaheadCount; k++) {
if (!inSubset(r.u16(q + k * 2))) return;
if (!inSubset(dv.getUint16(q + k * 2, false))) return;
}
/** 第二遍:全部在子集,收集 context gid */
q = ruleOff + 2;
for (let k = 0; k < backtrackCount; k++) contextGids.add(r.u16(q + k * 2));
for (let k = 0; k < backtrackCount; k++) contextGids.add(dv.getUint16(q + k * 2, false));
q += backtrackCount * 2 + 2;
for (let k = 0; k < inputLen; k++) contextGids.add(r.u16(q + k * 2));
for (let k = 0; k < inputLen; k++) contextGids.add(dv.getUint16(q + k * 2, false));
q += inputLen * 2 + 2;
for (let k = 0; k < lookaheadCount; k++) contextGids.add(r.u16(q + k * 2));
for (let k = 0; k < lookaheadCount; k++) contextGids.add(dv.getUint16(q + k * 2, false));
}
for (let k = 0; k < substCount; k++) {
/** SubstLookupRecord: sequenceIndex(2) + lookupListIndex(2) */
refs.add(r.u16(p + k * 4 + 2));
refs.add(dv.getUint16(p + k * 4 + 2, false));
}
}