在前一篇文章中,我们探索了拉链及其在功能编程中的应用.
在此文中,我们参照根基方法来衡量他们的业绩。
两种办法 我们定义了一个简单的树数据结构 和天真的根基方法 来翻转和修改树。
然后,我们实施拉链数据结构 及其操作 以转动和修改树。
每个基准执行10万项业务。
由以下形状产生出三棵完整的树: 深度×宽度节点 根据地图5×16 1,118,481 16 10×4 1,398,101 4 20×2 2,097,151 2 这里,深度计出从地根起的边缘.
所有这三棵树的叶子完全有1,048,576个,但其形状不同.
工作量为:随机查询.
通过从1到最大深度统一选择其深度,然后统一选择每个密钥来选择路径。
将节点的整数添加到校验和中 。
随机编辑.
以同样的方式生成路径,然后递增节点的整数.
两者均更新。
本地编辑.
以随机路径编辑节点开始 。
在每次编辑之前,请向上或向下移动一至两个级别。
在叶子上,下个动作必须是向上;在编辑根后,在另一个随机路径上重新启动.
例如: (随机起动) - > (倒数2)- (从一叶起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起起 测量细节 这些结果是基于使用下列环境运行的MacBook Air M4和24GB的RAM的基准:arm64,macOS 26.3.1 GHC 9.10.3, Cabal 3.12.1.0 标准 1.6.5.0 容器 0.7,随机 1.3.1 固定种子 20260716 测试程序由 .
树,路径,以及相对的拉链动作在定时区外生成并得到充分评价.
更新基准使用 : 严格的树地并强制每次更新,而不添加不相关的整个结果的倒转.
拉链在每批的末端被还给根,所以两个更新的实现产生相同的.
命令是: 计时结果, 数值显示为根基时间/拉链时间——更快地执行和加速.
速度快是被更快的时间所分出的时间更慢;例如,root 3.86x表示拉链所花的时间是根执行所花时间的3.86倍.
树随机取出 随机取出 随机取出 本地编辑 5×16 21.97/84.89 ms-根 3.86x 53.41/90.09 ms-根 1.69×32.17/31.52 ms-大致捆绑 10×4 20.96/84.93 ms-根 4.05×56.86/87.92 ms-根 1.55×26.18/16.61 ms-拉链 1.58×20 33.76 /114.34 ms-根 3.39×88.20/118.11 ms-根 1.34×30.45/9.14 ms-根拉链 3.33x 成果分析 A根取出 根取出取出 进行每一级一次并分配很少.
拉链在向下移动时需要更新地图并分配内存,因此随机取景速度会更慢.
随机编辑缩小了差距,因为根执行还必须重建路径上的每一张地图.
拉链仍然较慢,因为它的行走比以根为基础的执行要更远:通常在移动到下一个目标之前需要爬到靠近根部的地方.
两个随机目标之间的路径通常比从根到任一目标的路径要长.
就本地工作量而言, 根执行开始于每次编辑, 在最深的树上,以根为基础的执行仍然会为每次编辑穿越一条漫长的道路,而拉链只在相邻的目标之间移动了约1.5个边缘.
基于根的执行在本地编辑上也快于随机编辑.
这很可能反映了更好的CPU-cache位置,因为连续操作重温了相同的分支.
不断增长的优势并不是由孤立的深度所造成:这些试验形状随着深度的加深而变窄.
更小的地图使每个级别操作对两个执行都更便宜.
实用外卖 对孤立或分散操作使用根法,e