perf(gsub): writeChainFormat3 coverage 槽改 writeInt16At 回填

type6 format3 的 coverage 偏移槽原用 allHolders: number[][] + reserveOffset16
闭包模式(每槽 [0] 单元素数组 + patches push + flush 回填)。改为 writeUint16(0)
占位 + covSlotPositions 记录字节位置 + writeInt16At 直接回填(与优化329 subtable
slot 同思路),消除每槽的 [0] 数组分配 + reserveOffset16 闭包。

node --prof 显示 GrowFastSmiOrObjectElements 3.7% + ArrayPrototypePush 3.2%
主来自 writeChainFormat3/serializeChainedContextSubst 的 allHolders grow。
FiraCode subsetGSUB min 0.229→0.216ms(-5.7%),端到端 avg 3.4→2.9ms(-15%),
29 用例输出字节全相同 SSIM 一致。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
崮生(子虚) 2026-07-25 07:39:06 +08:00
parent e8989c7fa4
commit 98102bc3be

View File

@ -1209,14 +1209,17 @@ function writeChainFormat3(
parsed: { backCovs: number[][]; inputCovs: number[][]; lookCovs: number[][]; records: Array<{ seq: number; lookup: number }> },
): void {
const subStart = w.length;
const allHolders: number[][] = [];
/** Offset16 flush allHolders[slotIdx]
* IIFE slotIdx allHolders.length-1 flush
* coverage coverageFiraCode === */
/** coverage writeUint16(0) emitCoverage writeInt16At
* allHolders: number[][] + reserveOffset16 [0] +
* reserveOffset16 patches push + flush 329 chain coverage slot
* coverage = backCovs + inputCovs + lookCovs grow */
const totalCovSlots = parsed.backCovs.length + parsed.inputCovs.length + parsed.lookCovs.length;
const covSlotPositions: number[] = new Array<number>(totalCovSlots);
/** 占位写入 coverage 偏移槽并记录其字节位置 */
let slotIdx = 0;
const reserveCovSlot = () => {
const slotIdx = allHolders.length;
allHolders.push([0]);
w.reserveOffset16(subStart, () => allHolders[slotIdx][0]);
covSlotPositions[slotIdx++] = w.length;
w.writeUint16(0);
};
w.writeUint16(3);
w.writeUint16(parsed.backCovs.length);
@ -1231,15 +1234,16 @@ function writeChainFormat3(
w.writeUint16(rc.lookup);
}
let holderIdx = 0;
/** 写出各组 coverage 并回填偏移槽(相对 subStart */
let posIdx = 0;
for (const cov of parsed.backCovs) {
allHolders[holderIdx++][0] = emitCoverage(w, cov);
w.writeInt16At(covSlotPositions[posIdx++], emitCoverage(w, cov) - subStart);
}
for (const cov of parsed.inputCovs) {
allHolders[holderIdx++][0] = emitCoverage(w, cov);
w.writeInt16At(covSlotPositions[posIdx++], emitCoverage(w, cov) - subStart);
}
for (const cov of parsed.lookCovs) {
allHolders[holderIdx++][0] = emitCoverage(w, cov);
w.writeInt16At(covSlotPositions[posIdx++], emitCoverage(w, cov) - subStart);
}
}