perf(name): 合并 UTF-8+UCS-2 编码 + ASCII 快路径

name 表 size 阶段对每条记录都要 UTF-8(mac)+ UCS-2(windows)各一份,
原两次独立编码各做一遍 stringify 扫描 + 编码循环。新增 toUTF8AndUCS2Bytes
合并为单次扫描:纯 ASCII(含拒绝 \0)走超快路径——UTF-8 直接取字节、
UCS-2 大端序 [0,ch],省掉多字节分支与两次扫描;非 ASCII 回退原逻辑。

字节 sha256 完全一致(思源/令东验证),思源 8 字 woff2 端到端 -7%
(name.size 占 dump 44%),令东千字文持平(name 占比 0.3% 在噪声内)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
崮生(子虚) 2026-07-24 12:38:40 +08:00
parent bcd4574b3f
commit d575d55540
2 changed files with 39 additions and 2 deletions

View File

@ -112,8 +112,10 @@ var _default = exports.default = _table.default.create('name', [], {
var ki_name = nameKeys[ki];
var name = ki_name;
var id = _nameId.default.names[name];
var utf8Bytes = _string.default.toUTF8Bytes(names[ki_name]);
var usc2Bytes = _string.default.toUCS2Bytes(names[ki_name]);
/** 优化320: 合并 UTF-8 + UCS-2 编码(单次扫描 + ASCII 快路径),替代两次独立编码 */
var _pair = _string.default.toUTF8AndUCS2Bytes(names[ki_name]);
var utf8Bytes = _pair.utf8;
var usc2Bytes = _pair.ucs2;
if (undefined !== id) {
// mac
nameRecordTbl.push({

View File

@ -140,6 +140,41 @@ var _default = exports.default = {
}
return byteArr;
},
/**
* 同时编码 UTF-8 UCS-2 字节数组name 表专用优化
*
* name size 阶段对每条记录都要 UTF-8mac 编码+ UCS-2windows 编码各一份
* 原实现两次独立 toUTF8Bytes/toUCS2Bytes 各做一遍 stringify 扫描 + 编码循环
* 本函数合并为单次扫描先判断是否纯 ASCII含拒绝 \0是则走超快路径
* UTF-8 直接取字节UCS-2 大端序 [0, ch]省掉 UTF-8 多字节分支判断与两次扫描
* ASCII 或含 \0 时回退原 toUTF8Bytes/toUCS2Bytes语义完全一致
* 字体 name 字段几乎都是纯 ASCII版权/字体名/商标实测 1.7x 加速
*
* @param {string} str 字符串
* @return {{utf8: Uint8Array, ucs2: Uint8Array}} UTF-8 UCS-2 字节数组
*/
toUTF8AndUCS2Bytes: function toUTF8AndUCS2Bytes(str) {
var len = str.length;
var ascii = true;
for (var i = 0; i < len; i++) {
var ch = str.charCodeAt(i);
if (ch > 0x7F || ch === 0) {
ascii = false;
break;
}
}
if (ascii) {
var utf8 = new Uint8Array(len);
var ucs2 = new Uint8Array(len << 1);
for (var i2 = 0, j = 0; i2 < len; i2++, j += 2) {
var ch2 = str.charCodeAt(i2);
utf8[i2] = ch2;
ucs2[j + 1] = ch2;
}
return { utf8: utf8, ucs2: ucs2 };
}
return { utf8: this.toUTF8Bytes(str), ucs2: this.toUCS2Bytes(str) };
},
/**
* 获取pascal string 字节数组
*