mirror of
https://github.com/2234839/web-font.git
synced 2026-09-15 13:35:49 +08:00
GPOS/GSUB 表类 read 原用 reader.readBytes (= new Uint8Array(view.buffer, off, len).slice()), .slice() 拷贝整个表字节(初夏 GPOS 68KB、GSUB 31KB)。V8 中 68KB slice 耗 ~40μs, 而 subarray 零拷贝仅 ~0.3μs(130× 差距)。 GPOS/GSUB 是原始字节透传:subsetGPOS/subsetGSUB 只读 OTReader + 写全新 OTWriter, write 只 writeBytes 只读,optimize 不碰,整个 read→optimize→subset→write 生命周期 从不原地修改底层字节,故可安全返回共享 ArrayBuffer 的 subarray 视图。 初夏 full read 0.124→0.063ms (-49%),readBuffer 0.165→0.098ms。 全基准 SSIM 与输出字节完全不变。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
31 lines
1.5 KiB
TypeScript
31 lines
1.5 KiB
TypeScript
import fs from 'node:fs';
|
|
import * as TTFReaderNS from './vendor/fonteditor-core/lib/ttf/ttfreader.js';
|
|
const TTFReader: any = (TTFReaderNS as any).default.default ?? (TTFReaderNS as any).default ?? TTFReaderNS;
|
|
|
|
function median(a: number[]) { return a.slice().sort((x,y)=>x-y)[Math.floor(a.length/2)]; }
|
|
function bench(label: string, mk: () => () => void, iters = 9) {
|
|
const fn = mk();
|
|
for (let i = 0; i < 3; i++) fn();
|
|
const ts: number[] = [];
|
|
for (let i = 0; i < iters; i++) { const f = mk(); const t0 = performance.now(); f(); ts.push(performance.now() - t0); }
|
|
console.log(`${label}: ${median(ts).toFixed(3)}ms (min ${Math.min(...ts).toFixed(3)})`);
|
|
}
|
|
|
|
for (const [name, p, text] of [
|
|
['初夏标点', '/mnt/d/字体资源/初夏明朝/初夏明朝-Regular.ttf', ',。!?、;:“”‘’'],
|
|
['思源8字', './font/思源黑体.ttf', '天地玄黄宇宙洪荒'],
|
|
] as const) {
|
|
const buf = fs.readFileSync(p);
|
|
const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset+buf.byteLength) as ArrayBuffer;
|
|
const cps = Array.from(text).map(c => c.codePointAt(0)!);
|
|
console.log(`\n=== ${name} ===`);
|
|
|
|
bench(' readBuffer', () => () => { const r = new (TTFReader as any)({ subset: cps, kerning: true }); r.readBuffer(ab); });
|
|
bench(' resolveGlyf', () => () => {
|
|
const r = new (TTFReader as any)({ subset: cps, kerning: true });
|
|
const ttf = r.readBuffer(ab);
|
|
r.resolveGlyf(ttf);
|
|
});
|
|
bench(' full read', () => () => { const r = new (TTFReader as any)({ subset: cps, kerning: true }); r.read(ab); });
|
|
}
|