From ece6eeca2f0c2b901732bc0f8573d9f32aa999f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=AE=E7=94=9F=EF=BC=88=E5=AD=90=E8=99=9A=EF=BC=89?= <2234839456@qq.com> Date: Fri, 24 Jul 2026 09:15:17 +0800 Subject: [PATCH] =?UTF-8?q?perf(buffer):=20toBuffer=20ArrayBuffer=E2=86=92?= =?UTF-8?q?Buffer=20=E7=94=A8=20Buffer.from=20=E9=9B=B6=E6=8B=B7=E8=B4=9D?= =?UTF-8?q?=E6=9B=BF=E4=BB=A3=E9=80=90=E5=AD=97=E8=8A=82=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 千字文 ttf 0.396ms→0.252ms(-36%),woff2 不受影响(不走 node Buffer 路径)。 Writer 的 ArrayBuffer 精确分配为 ttfSize(offset=0),getBuffer 返回完整 buffer, Buffer.from 共享底层内存无 over-exposure 风险。SSIM 全部不变。 Co-Authored-By: Claude Opus 4.8 (1M context) --- _prof.entry.ts | 8 ++++++++ _speed.entry.ts | 16 ++++++++++++++++ vendor/fonteditor-core/lib/nodejs/buffer.js | 13 ++++++------- 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 _prof.entry.ts create mode 100644 _speed.entry.ts diff --git a/_prof.entry.ts b/_prof.entry.ts new file mode 100644 index 0000000..8f0d1cb --- /dev/null +++ b/_prof.entry.ts @@ -0,0 +1,8 @@ +import { readFileSync } from 'fs'; +import { fontSubset } from './backend/font_util/font.js'; +const buf = readFileSync('font/令东齐伋复刻体.ttf'); +const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); +const text = '天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰余成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔'; +fontSubset(ab, text, { sourceType: 'ttf', outType: 'ttf' }); +const N = 500; +for (let i = 0; i < N; i++) fontSubset(ab, text, { sourceType: 'ttf', outType: 'ttf' }); diff --git a/_speed.entry.ts b/_speed.entry.ts new file mode 100644 index 0000000..7f5d9df --- /dev/null +++ b/_speed.entry.ts @@ -0,0 +1,16 @@ +import { performance } from 'perf_hooks'; +import { readFileSync } from 'fs'; +import { fontSubset } from './backend/font_util/font.js'; +const buf = readFileSync('font/令东齐伋复刻体.ttf'); +const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); +const cases: [string,string,any][] = [ + ['千字文woff2','天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰余成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔',{sourceType:'ttf',outType:'woff2'}], + ['千字文ttf','天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰余成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔',{sourceType:'ttf',outType:'ttf'}], +]; +for (const [label,text,opt] of cases) { + fontSubset(ab, text, opt); + const N = 300; + const t0 = performance.now(); + for (let i=0;i