Skip to content

后端选择与性能 ​

根据实际词典、输入和输出规模的测量结果选择后端。

性能图表 ​

以下为已测量的实现快照,不是实时基准,也不代表最新 npm 发布版。耗时与内存越低越好;展开数据表可查看数值和波动。

优化前后的扫描性能

18 个场景使用同一基线。虚线代表原耗时(1×);0.4× 表示耗时为原来的 40%。切换操作可查看不同查询的收益。

优化后 / 优化前 · 越低越快 · 基线 = 1×

精确测量值与波动
场景优化前 · ms优化后 · ms优化后 / 优化前耗时变化
极短 ASCII0.001269675 (0.000014722; 0.000023004)0.000136628 (0.00000104; 0.00000094)0.107609-89.24%
CRLF2.572690125 (0.057604125; 0.026924375)1.281498688 (0.02346875; 0.014897125)0.498116-50.19%
ASCII + 组合字符2.80034375 (0.043317625; 0.037565125)2.659710937 (0.04278125; 0.04969275)0.94978-5.02%
Unicode 开头2.463591125 (0.030835938; 0.006440125)2.329559937 (0.01759375; 0.027726625)0.945595-5.44%
ASCII 前缀2.87225525 (0.0160625; 0.068546938)0.856292328 (0.007295562; 0.035654953)0.298125-70.19%
较早出现 Unicode4.819791625 (0.036427125; 0.114406125)1.504946594 (0.014993531; 0.094178344)0.312243-68.78%
普通文本2.021273437 (0.0326745; 0.0097005)0.609461578 (0.006155594; 0.002634109)0.301524-69.85%
无命中2.472632813 (0.011533937; 0.012984375)0.718931641 (0.013856766; 0.023575516)0.290756-70.92%
混合 Unicode0.865691406 (0.013355469; 0.001882812)0.862647125 (0.009561219; 0.012480469)0.996483-0.35%
共享前缀1.442992187 (0.014175781; 0.060458313)0.425919594 (0.002939461; 0.012159187)0.295164-70.48%
密集后缀2.35503125 (0.020028625; 0.039721313)2.357835937 (0.02818225; 0.098164062)1.001191+0.12%
高输出词典 · 无命中4.63714575 (0.017401; 0.130124875)4.655984375 (0.0189115; 0.163510375)1.004063+0.41%
高输出词典 · 稀疏4.782875 (0.043520875; 0.03275)4.759760375 (0.030213625; 0.098999875)0.995167-0.48%
重复词条2.288026062 (0.009601563; 0.022078063)1.725445312 (0.031473938; 0.0095)0.75412-24.59%
靠前命中7.3808335 (0.04828125; 0.234719)2.25433075 (0.05160675; 0.032132812)0.30543-69.46%
靠后命中7.4371145 (0.02235425; 0.1510415)2.260109375 (0.037114625; 0.019760375)0.303896-69.61%
1 万词条1.967362 (0.0115755; 0.017362)0.601537109 (0.002729172; 0.005005203)0.305758-69.42%
长文本20.820208 (0.292167; 0.155749)20.587333 (0.39925; 0.385)0.988815-1.12%

耗时单元格格式为中位数 ms(轮内 MAD;轮间 MAD)。MAD 表示波动,不是置信区间;— 表示未记录该统计量。

benchmarks-optimization.json · 2026-09-23 · 5 轮独立进程 · 0d10f03

测量环境与完整来源
node
v24.18.0
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T07:35:25.510Z
实现快照
0d10f03bade9609faf6bbe086b0dd4666452c4e0
工作区存在变更
true
基线
b01c9f2
Implementation SHA-256
3b9119908bfda141b7ebba8f291ebba40f285cb04bbde0caadb87781cade0e36
Baseline SHA-256
c0e85759b5226525ba51f7dc1f95dc427340118dca47fc93c72d613e6e46cdbf
Corpus SHA-256
4afa3eee0768ace1840771227bd94753d446ab82a09bbaf11d2acf1834462c5e
Report SHA-256
00e2cd3c6630174fa4be71ff03169a4317e0650f9b8d5856cb6fc81c07b8239f
后续针对性复测与仍然存在的取舍

上方扫描图保留原始五轮快照。下列后续测量保留各自的实现指纹,不混入该图。普通小词典的重复热构建耗时变化 7.3%(正值表示变慢)。高输出词典即使在无命中文本上也使用原生完整枚举,因此 ASCII 加速并非适用于所有情况。

精确测量值与波动
场景操作优化前 · ms优化后 · ms耗时变化轮数 / 来源
较早出现 Unicodeload0.007536184 (0.000202433; 0.000046631)0.007769521 (0.000126221; 0.000037882)+3.1%7 · scanRecheck
较早出现 Unicodebuild0.006296193 (0.000046499; 0.000082372)0.0060964 (0.000044271; 0.00004863)-3.17%7 · scanRecheck
较早出现 Unicodematch0.000103466 (0.000000839; 0.000003649)0.000100652 (0.000000945; 0.000003679)-2.72%7 · scanRecheck
混合 Unicodeload0.161373859 (0.002421387; 0.001249348)0.160725586 (0.001869141; 0.002076008)-0.4%7 · scanRecheck
混合 Unicodebuild0.162988445 (0.001462242; 0.001569176)0.154940594 (0.001020508; 0.000681969)-4.94%7 · scanRecheck
混合 Unicodematch0.003720205 (0.000103099; 0.000160105)0.00419518 (0.000515127; 0.000273702)+12.77%7 · scanRecheck
共享前缀load1.019778656 (0.038187469; 0.019308594)1.076451844 (0.037391937; 0.027854188)+5.56%7 · scanRecheck
共享前缀build1.314447938 (0.019407563; 0.023204406)0.849103516 (0.008429687; 0.030935547)-35.4%7 · scanRecheck
共享前缀match0.000300666 (0.000001889; 0.000009721)0.000310079 (0.000001184; 0.000011546)+3.13%7 · scanRecheck
重复词条load0.056904215 (0.001910727; 0.000343344)0.057346436 (0.002123615; 0.001427814)+0.78%7 · scanRecheck
重复词条build0.036539266 (0.000353801; 0.000282308)0.045132162 (0.000180543; 0.001015463)+23.52%7 · scanRecheck
重复词条match0.00009635 (0.000000731; 0.000001887)0.000096013 (0.000001251; 0.000003813)-0.35%7 · scanRecheck
重复词条load0.0510448 (0.000971191; 0.000046184)0.051154216 (0.000773642; 0.000258504)+0.21%7 · builderRecheck
重复词条build0.035663778 (0.000324342; 0.000484985)0.017146688 (0.000130717; 0.000104512)-51.92%7 · builderRecheck
重复词条match0.000097522 (0.000000668; 0.000002916)0.000099024 (0.000000907; 0.000001781)+1.54%7 · builderRecheck
普通文本load0.074622314 (0.002341635; 0.001869955)0.078218018 (0.003306396; 0.00222526)+4.82%7 · builderRecheck
普通文本build0.075951334 (0.001940672; 0.002001219)0.081459799 (0.001128416; 0.000841391)+7.25%7 · builderRecheck
普通文本match0.000145013 (0.000002099; 0.000007323)0.000146319 (0.0000032; 0.000005473)+0.9%7 · builderRecheck
共享前缀load1.012390625 (0.029386719; 0.030472656)1.033446625 (0.023977906; 0.045339844)+2.08%7 · builderRecheck
共享前缀build1.26889975 (0.042160187; 0.031625)0.841124344 (0.031281234; 0.051948562)-33.71%7 · builderRecheck
共享前缀match0.000313238 (0.000002728; 0.000009483)0.000354697 (0.000012394; 0.000044048)+13.24%7 · builderRecheck
混合 Unicodeload0.161232094 (0.002578449; 0.001061688)0.158745281 (0.003340008; 0.001036133)-1.54%7 · builderRecheck
混合 Unicodebuild0.164593262 (0.00159798; 0.001666504)0.15644059 (0.002091469; 0.00152018)-4.95%7 · builderRecheck
混合 Unicodematch0.004181345 (0.000354461; 0.000251313)0.003797536 (0.000316915; 0.000310079)-9.18%7 · builderRecheck
共享前缀match0.000295103 (0.000003017; 0.000013225)0.000304079 (0.000003312; 0.000004858)+3.04%7 · presenceRecheck

benchmarks-optimization-recheck.json · 2026-09-23 · 7 轮独立进程 · 0d10f03

测量环境与完整来源
node
v24.18.0
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T07:50:21.300Z
实现快照
0d10f03bade9609faf6bbe086b0dd4666452c4e0
工作区存在变更
true
基线
b01c9f2
Implementation SHA-256
3b9119908bfda141b7ebba8f291ebba40f285cb04bbde0caadb87781cade0e36
Baseline SHA-256
b6d995a840e4962a368f3f098a3e2c013a05f294ec8860efcd549ce9a5ff16a3
Corpus SHA-256
4afa3eee0768ace1840771227bd94753d446ab82a09bbaf11d2acf1834462c5e
Report SHA-256
ba12ed87faa1dc14127bf7be75530b5d1477969c874c8f99e461320b2df08680

benchmarks-final-builder-recheck.json · 2026-09-23 · 7 轮独立进程 · dd97451

测量环境与完整来源
node
v24.18.0
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T08:16:31.795Z
实现快照
dd97451efdce9586bbe7d3f442a410ed77d07853
工作区存在变更
true
基线
b01c9f2
Implementation SHA-256
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c
Baseline SHA-256
59e4199637e07de27cf118aee97e5cc736356eaf5813d2017811c39aa4e937c4
Corpus SHA-256
4afa3eee0768ace1840771227bd94753d446ab82a09bbaf11d2acf1834462c5e
Report SHA-256
4c02cf008470fc6b27a6d48f339ee593b22e476f3f268ef9406241caf7bbdcfe

benchmarks-presence-final-recheck.json · 2026-09-23 · 7 轮独立进程 · dd97451

测量环境与完整来源
node
v24.18.0
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T08:20:14.774Z
实现快照
dd97451efdce9586bbe7d3f442a410ed77d07853
工作区存在变更
true
基线
b01c9f2
Implementation SHA-256
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c
Baseline SHA-256
3fc0b1a2891ab6fbc993d76904205615631e871dc262d41d3dac990d13b34725
Runner SHA-256
f45aeb0a9c3eda6c4b9fd27056167d3888c22f8a8c66f616ab829ea901243c55
Corpus SHA-256
4afa3eee0768ace1840771227bd94753d446ab82a09bbaf11d2acf1834462c5e
Report SHA-256
842c493eae1c6965b7456f24f639aea7fa86272975a13dcdd461c496c3a62a38

v1、v2 与优化后 v3

统一输出独立 UTF-16 范围后,优化后 v3 在 14 个场景中的 14 个快于 v2。v1 在部分 ASCII 输入上仍更快。正确性检查失败的结果不绘制柱形,也不计算速度比。

独立范围结果 · 越低越快 · v2 = 1×。v1 在 emoji、ZWJ、组合字符和 CRLF 场景中不可比较。

独立范围耗时 · 中位数 ms(MAD;轮间 MAD)
场景v1 · msv2 · ms优化后 v3 · ms轮数 / 来源
普通文本0.671835937 (0.007359375; 0.019706375)3.49615625 (0.027041625; 0.029947875)0.598543625 (0.005460937; 0.003548172)5 · 原始
无命中0.421351562 (0.004225906; 0.008166016)4.42000525 (0.039885375; 0.0384895)0.598173172 (0.005952469; 0.024811844)7 · 复测
共享前缀0.475947906 (0.006143219; 0.009919281)2.524388 (0.020815125; 0.046349)0.393973313 (0.003625977; 0.007260742)5 · 原始
密集后缀3.114309938 (0.021072938; 0.015197875)3.259916688 (0.0251745; 0.051653688)2.305966125 (0.025445312; 0.0263125)5 · 原始
重复词条1.871252625 (0.017622375; 0.054755188)3.55315625 (0.02338525; 0.03960425)1.631329437 (0.016760406; 0.011783875)5 · 原始
靠前命中1.580188812 (0.033903625; 0.009697906)13.1050625 (0.1155415; 0.08775)2.129585938 (0.015182313; 0.073263)7 · 复测
靠后命中1.568641938 (0.013188812; 0.041936187)12.9421045 (0.0714375; 0.1565215)2.169085938 (0.027036438; 0.052179688)7 · 复测
1 万词条0.819513016 (0.022947266; 0.032115234)3.840359375 (0.053541625; 0.099510375)0.598176438 (0.006532563; 0.005749344)5 · 原始
长文本12.49685425 (0.09892725; 0.2773645)60.378291 (1.155417; 0.773166)9.545948 (0.07855225; 0.21780225)5 · 原始
中文2.33740625 (0.043601625; 0.076854188)4.956802 (0.06201575; 0.082036375)2.350195313 (0.0244115; 0.056028625)5 · 原始
Emoji不可比较1.875125 (0.031598937; 0.0247005)0.809717438 (0.003578125; 0.009024719)5 · 原始
ZWJ 序列不可比较0.700683594 (0.004184891; 0.005352203)0.331774742 (0.002745773; 0.001072594)5 · 原始
组合字符不可比较2.134664063 (0.026484375; 0.01678125)1.042622375 (0.008112; 0.008574188)5 · 原始
CRLF不可比较2.288255187 (0.019752563; 0.003966125)0.570280609 (0.004173156; 0.010173844)5 · 原始

v1/v2 原生搜索返回分组结果,v3 返回独立匹配对象。下方原生耗时执行的输出工作不同,不能据此直接比较等价吞吐量。

原生输出耗时 · 中位数 ms(MAD;轮间 MAD)
场景v1 · msv2 · ms优化后 v3 · ms轮数 / 来源
普通文本0.479438141 (0.007430984; 0.004863266)1.701596375 (0.018164062; 0.020921937)0.610501953 (0.004858719; 0.014290375)7 · 复测
无命中0.423757812 (0.005669266; 0.006125)2.1667995 (0.017763; 0.02735675)0.598205719 (0.007033203; 0.028513016)7 · 复测
共享前缀0.436317703 (0.004397125; 0.000654312)1.302658875 (0.008703156; 0.014859406)0.392411781 (0.002458328; 0.011767258)5 · 原始
密集后缀0.007156077 (0.000054026; 0.000077382)0.051514242 (0.000309977; 0.000531006)2.313322875 (0.032333313; 0.012132875)7 · 复测
重复词条0.327894531 (0.00320475; 0.001456055)0.943231781 (0.005602844; 0.011592437)1.623438813 (0.014154938; 0.016690125)7 · 复测
靠前命中1.584460937 (0.019053406; 0.014001313)6.58317725 (0.04205225; 0.0798855)2.144432313 (0.017877625; 0.087416625)7 · 复测
靠后命中1.571467438 (0.013057313; 0.020328125)6.478395875 (0.0583645; 0.109989625)2.182192687 (0.015388; 0.026875)7 · 复测
1 万词条0.65314975 (0.004081359; 0.016722016)1.886552125 (0.0406745; 0.010877562)0.599035156 (0.005404297; 0.011255859)5 · 原始
长文本8.896427 (0.0968125; 0.1152395)29.96625 (0.276334; 0.093042)9.651927 (0.06138525; 0.2726145)7 · 复测
中文1.906877563 (0.02800525; 0.02590625)2.318304687 (0.052122375; 0.033828125)2.413601563 (0.051817688; 0.018005188)7 · 复测
Emoji不可比较1.018970031 (0.008847656; 0.015799438)0.819953125 (0.005609375; 0.018988281)5 · 原始
ZWJ 序列不可比较0.383055344 (0.00359375; 0.000662766)0.331748703 (0.002734055; 0.001452789)5 · 原始
组合字符不可比较1.077026031 (0.004104156; 0.013281219)1.052846375 (0.010964875; 0.005266937)5 · 原始
CRLF不可比较1.088936187 (0.006821625; 0.011173188)0.584257156 (0.007115234; 0.009666672)5 · 原始

七轮复测通过实现、环境、runner 与语料校验后,才按完整的“场景+操作”覆盖三个版本的耗时;其余组保留五轮。内存测量仍取原始报告。

benchmarks-versions-optimization.json · 2026-09-23 · 5 轮独立进程 · dd97451

测量环境与完整来源
node
v24.18.0
pnpm
pnpm@12.5.1
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T08:22:10.112Z
实现快照
dd97451efdce9586bbe7d3f442a410ed77d07853
工作区存在变更
true
Implementation SHA-256
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c
Runner SHA-256
e557a2c3f4c207fb5a8f2dbf24a9da15572830e94a005716559218cb6323f7ea
Corpus SHA-256
8dbac3966d9f23c4047c59576d55779948d57a39c7603acdf7b748506f701d4d
Report SHA-256
f9df675eeca635f032eb77e18f107bd6ba7d8031194ee4a4fcf7dcb2d6dcd9f3
v1 · 1.1.0
92e364bded18733ea20c25d2ba2773677970600be6d65da05fa325267a19d2c1
v2 · 2.0.4
8de77ed31903160adb53c77cf4aff80032144f685710c719c5490e592c9d7397
current · 3.2.0
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c

benchmarks-versions-optimization-recheck.json · 2026-09-23 · 7 轮独立进程 · dd97451

测量环境与完整来源
node
v24.18.0
pnpm
pnpm@12.5.1
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T08:31:59.230Z
实现快照
dd97451efdce9586bbe7d3f442a410ed77d07853
工作区存在变更
true
Implementation SHA-256
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c
Runner SHA-256
e557a2c3f4c207fb5a8f2dbf24a9da15572830e94a005716559218cb6323f7ea
Corpus SHA-256
8dbac3966d9f23c4047c59576d55779948d57a39c7603acdf7b748506f701d4d
Report SHA-256
ef2bb327ec120146210728cadba8d622c0498530b18a4072086db5daace5f1c2
v1 · 1.1.0
92e364bded18733ea20c25d2ba2773677970600be6d65da05fa325267a19d2c1
v2 · 2.0.4
8de77ed31903160adb53c77cf4aff80032144f685710c719c5490e592c9d7397
current · 3.2.0
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c

大词典冷构建

1,000,000 个词条下,冷构建耗时变化 -59%,峰值 RSS 变化 -71.3%。这里是七个独立进程的中位数;冷进程构建与重复热构建是不同指标。

构建耗时

进程峰值 RSS

横轴为词条数。峰值 RSS 包括进程运行时和构建临时状态,不等于词典常驻内存。历史基线通过 data URL 加载模块,因此这一整进程测量也包含模块加载器存储方式的差异。

精确测量值与波动
词条数优化前 · ms优化后 · ms耗时变化优化前 MAD · ms优化后 MAD · ms优化前 RSS · MiB优化后 RSS · MiBRSS 变化优化前 RSS MAD · MiB优化后 RSS MAD · MiB优化前 heap · MiB优化后 heap · MiB优化前 buffers · MiB优化后 buffers · MiB
10,00031.937520.737292-35.07%0.6406251.149459106.29687571.625-32.62%0.6406250.4531250.546120.5414511.6025161.602516
100,000186.38487592.04775-50.61%2.6110842.525708407.109375140.375-65.52%0.6250.218753.4950793.49029516.02207216.022072
1,000,0001,945.30275797.322209-59.01%67.38412520.2749582,300.21875660.15625-71.3%2.4531251.23437534.21742234.212784160.217628160.217628

benchmarks-builder-final.json · 2026-09-23 · 7 轮独立进程 · dd97451

测量环境与完整来源
node
v24.18.0
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T08:20:48.462Z
实现快照
dd97451efdce9586bbe7d3f442a410ed77d07853
工作区存在变更
true
基线
b01c9f2
Implementation SHA-256
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c
Baseline SHA-256
18cd42aabc95d9d3dfcd94ae9983fdd8d1ad7e2908860f26cc36f38136e28dbf
Runner SHA-256
05d461798498b3528241cf8dc5e088b4297f93da826d6caeeab01939ba2c7b85
Report SHA-256
ed7f42a9f1abb3eef12296b678b40edeead71419619cba954d7371fc20f2832a

词典常驻内存

独立内存实验禁用计时,并通过多份存活词典取平均。柱形比较保留的 JS 堆;ArrayBuffer 以字节单独列示。18 个场景中有 18 个的 ArrayBuffer 测量值未变化。

优化后 / 优化前 · 基线 = 1× · 从零开始,避免放大小幅差异

精确测量值与波动
场景优化前 heap · B优化后 heap · B堆变化优化前 buffers · B优化后 buffers · B
极短 ASCII3,929.9043,902.088-0.71%00
CRLF4,366.9524,368.912+0.04%00
ASCII + 组合字符4,192.5844,191.728-0.02%00
Unicode 开头4,148.2564,146.648-0.04%00
ASCII 前缀4,081.6484,066.56-0.37%00
较早出现 Unicode3,907.4723,900.928-0.17%00
普通文本13,854.67213,817.168-0.27%8,1568,156
无命中29,062.8429,109.44+0.16%20,35620,356
混合 Unicode9,098.689,102.552+0.04%7,2607,260
共享前缀55,875.8455,757.2-0.21%264,568264,568
密集后缀8,500.0488,497.984-0.02%3,8683,868
高输出词典 · 无命中5,992.086,041.376+0.82%328328
高输出词典 · 稀疏5,992.086,041.392+0.82%328328
重复词条14,492.59214,432.592-0.41%1,6001,600
靠前命中3,907.4723,900.928-0.17%00
靠后命中3,907.4723,900.928-0.17%00
1 万词条498,346.4496,666.4-0.34%1,680,3601,680,360
长文本4,845.1524,823.632-0.44%00

benchmarks-retained-optimization.json · 2026-09-23 · 7 轮独立进程 · 0d10f03

测量环境与完整来源
node
v24.18.0
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T08:13:54.285Z
实现快照
0d10f03bade9609faf6bbe086b0dd4666452c4e0
工作区存在变更
true
基线
b01c9f2
Implementation SHA-256
6716d18808b34e066dc30eaaaa8b90d773adc567feda47150f18e51b0283296c
Baseline SHA-256
68cd0ffc3df077980b83ce045256e4627b9c006a0d086f334c32492bb13ffb18
Corpus SHA-256
4afa3eee0768ace1840771227bd94753d446ab82a09bbaf11d2acf1834462c5e
Report SHA-256
71bc3027f7f0ff0101008e492526541a79f895ec517aff726c158a9e87a32ad0

三个版本的 1 万词词典

堆叠部分使用同一单位:1 MiB = 1,048,576 字节。不包含返回结果对象与进程峰值 RSS。

各版本词典内存明细
版本JS heap · BArrayBuffer · B合计 · MiB
v17,366,382.407.02513
v27,366,56007.025299
优化后 v3496,567.21,680,3602.07608

benchmarks-versions-optimization.json · 2026-09-23 · 5 轮独立进程 · dd97451

测量环境与完整来源
node
v24.18.0
pnpm
pnpm@12.5.1
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T08:22:10.112Z
实现快照
dd97451efdce9586bbe7d3f442a410ed77d07853
工作区存在变更
true
Implementation SHA-256
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c
Runner SHA-256
e557a2c3f4c207fb5a8f2dbf24a9da15572830e94a005716559218cb6323f7ea
Corpus SHA-256
8dbac3966d9f23c4047c59576d55779948d57a39c7603acdf7b748506f701d4d
Report SHA-256
f9df675eeca635f032eb77e18f107bd6ba7d8031194ee4a4fcf7dcb2d6dcd9f3
v1 · 1.1.0
92e364bded18733ea20c25d2ba2773677970600be6d65da05fa325267a19d2c1
v2 · 2.0.4
8de77ed31903160adb53c77cf4aff80032144f685710c719c5490e592c9d7397
current · 3.2.0
c7af20de2e8a6a0064b3755ef656d653b0e6d469429ac614a7f0c03d5bc32a6c

持续消费结果的长流

调用方立即消费每批输出。各点表示 GC 后的堆增长,基线在创建词典与输入之后测量,因此不包含两者预先占用的内存、调用方保留的结果、原生 ICU 分配或峰值 RSS。直线仅连接已测量的输入规模;测量仍包含运行时与 JIT 噪声。

all

leftmost-longest

EOF 前,优化后的 leftmost-longest 已输出 79,997 / 80,000 个匹配。表格还列出结束和取消后仍保留句柄时的内存。

精确测量值与波动
策略 / 快照UTF-16堆增长 · KiBArrayBuffer 增长 · KiBEOF 前已输出最终匹配数结束后堆增长 · KiB结束后 buffer 增长 · KiB
all · 优化前40,0002,031.015625011,997120,00014,666.7578130
all · 优化前120,0003,848.695313035,997120,00014,666.7578130
all · 优化前400,00014,707.843750119,997120,00014,666.7578130
all · 优化后40,000263.6875011,997120,000158.468750
all · 优化后120,000268.117188035,997120,000158.468750
all · 优化后400,000264.0078130119,997120,000158.468750
leftmost-longest · 优化前40,0002,899.5703130080,00023,179.2031250
leftmost-longest · 优化前120,0006,388.9296880080,00023,179.2031250
leftmost-longest · 优化前400,00023,208.250080,00023,179.2031250
leftmost-longest · 优化后40,000271.14062507,99780,000158.43750
leftmost-longest · 优化后120,000275.679688023,99780,000158.43750
leftmost-longest · 优化后400,000271.09375079,99780,000158.43750

benchmarks-stream-optimization.json · 2026-09-23 · 3 轮独立进程 · b6ebdce

测量环境与完整来源
node
v24.18.0
platform
darwin
arch
arm64
cpu
Apple M4 Max
icu
78.3
unicode
17.0
测量时间
2026-09-23T06:23:33.062Z
实现快照
b6ebdce7f04a8c511060a9af9a65ff64e9c9c04f
工作区存在变更
true
基线
b01c9f22b2566b3a6058b41b05564b214899c8d7
Implementation SHA-256
593af04bb53db03a3dd84c0be75c30ec04dc51cbd6e863af74db75d6a0e1fb7a
Baseline SHA-256
8c4bb499ac67a4b7917f264e0f84b36c5d88a3ba7cd0f5cdb0c75fd87b9b3566
Report SHA-256
0da839a7d97d632f9646508c5cc4a96da35371bb9e689a4013659235b573d389

后端选择 ​

优先使用默认紧凑后端。/fast 显式选择双数组存储;/unicode-fast 将该后端与完整折叠结合。默认入口不会加载可选编译器或折叠数据。

ts
import FastAhoCorasick from 'modern-ahocorasick/fast'

const matcher = new FastAhoCorasick(['cat'])
matcher.search('cat')[0]?.start // 0
matcher.getStats().backend // 'double-array'

实测取舍 ​

/fast 是显式选择的双数组后端,不保证普遍更快。它可能减少 ArrayBuffer 存储,却增加 JavaScript 堆占用; 通用游标的开销也可能主导扫描。以下数据来自流式处理、扫描器与构建器优化之前的快照。 在 Node 24.18.0 / Apple M4 Max 的一万词条 ASCII 对照中,/fast 构建和搜索耗时分别为 28.23 ms、4.34 ms,默认后端为 13.61 ms、2.00 ms。 保留堆分别为 3.52 MiB、0.47 MiB,数组缓冲分别为 1.18 MiB、1.60 MiB。这些是三轮中位数, 不代表优化后的构建或其他词典的结果。边界和折叠使用通用游标,所以带过滤的 count() 会枚举通过过滤的结果。默认精确计数和检测仍使用低分配路径。

能力对照固定为 @monyone/aho-corasick@1.5.10、@tanishiking/aho-corasick@0.0.1。 它们的坐标、重复词条和 Unicode 契约不同;本库保持自身语义,不复刻缺陷或方法别名。 运行 pnpm benchmark:external 查看可打印 ASCII 对照,分别报告统一后的独立范围、 原生结果、构建成本及内存。

三代版本对比使用 pnpm benchmark:versions:固定 npm v1.1.0、v2.0.4,与当前本地默认入口比较构建、原生搜索、独立范围转换和保留内存。Unicode 结果不正确的旧版场景不计算速度比。优化后版本对照 包含本轮测量;较早的 v1/v2/v3 报告 保留为历史快照。

优化构建的五轮对照中,独立范围输出在全部 14 份语料中均快于 v2;七轮复测确认 v1 扫描部分 ASCII 输入仍更快,历史原生分组输出的分配成本也不同。一万词条的词典保留堆加缓冲约为 2.08 MiB,两个旧版均约 7.03 MiB。选择版本应结合输出契约和负载,不能据此作普遍速度排名。

流式处理、扫描与构建优化报告 记录后续改动相对 b01c9f2 的测量:转换流的增量保留内存、18 场景扫描器对照、词典保留内存,以及一万至百万词条冷构建。报告区分预热重复构建、保留堆、ArrayBuffer 存储与构建峰值 RSS,并提供各进程原始数据、实现摘要和专项复测。

对于单个状态可能产生大量匹配的词典,完整枚举使用原生字素分段,以避免密集输出时的额外开销。这些词典在输入只有少量命中或没有命中时,也使用相同路径。因此 ASCII 加速取决于词典和文本,应同时测量具有代表性的无命中输入。计数和选中匹配扫描保持各自路径。

复现与解读 ​

sh
pnpm benchmark
pnpm benchmark:external
pnpm benchmark:versions
pnpm benchmark:scale
pnpm benchmark:stream
pnpm benchmark:docs

在仓库中运行这些命令。分别比较构建与扫描时间、保留堆和缓冲区;getStats().typedArrayBytes 不是总堆内存。过滤、折叠、结果数组及 longest-first 还有默认精确扫描之外的开销。工作台时间包含防抖、Worker 和传输,不是库性能基准。

测量来源:Extension benchmarks · v2/v3 benchmarks · ASCII benchmarks · Workbench measurements

MIT · Based on BrunoRB/ahocorasick