用途:在 Motoko 项目中用 bench-helper 库统一编写基准测试。每个 bench/*.bench.mo 文件定义一个基准模块,运行器可发现并执行全部测试。
主要能力:通过 Bench.Schema 描述基准的名称、描述、rows(被测变体)与 cols(输入类别),并返回带版本的 Bench.V1(schema, run);运行器多次调用 run(rowIndex, colIndex) 采集计时。
必要用法:在 mops.toml 的 [dev-dependencies] 添加 bench-helper;[optimize] 需配置(可为空,默认 O3),并要求在 [toolchain] 固定 wasm-opt 版本,如 wasm-opt = "132",否则 mops bench 测的是未优化 Wasm。基准文件放在仓库根目录 bench/ 下,后缀 .bench.mo,每文件暴露 public func init() : Bench.V1。注意字段名是 cols,需写 schema.rows.size();mo:core/Array 无 init,用 Array.tabulate 或 Array.repeat,可变数组用 VarArray。代码骨架保留原样:import Bench "mo:bench-helper"; Bench.V1(schema, func(ri : Nat, ci : Nat) = routines[ri]ci);。运行命令:mops install,然后 mops bench。若项目仍用 mo:base 可继续,导入对应替换。
常见限制:rows/cols 维度需与 routines 表匹配;昂贵初始化应放在 init 并闭包捕获;run 内结果用 ignore 消费防止死代码消除;run 内避免日志、随机分配,保持各行的 GC 压力可比。bench-helper 每格多次调用 run,若操作会原地修改输入(如原地排序、哈希更新),后续调用看到的是修改后状态,需在 run 内重建输入或说明测的是重复运行状态。
适用场景:为 Motoko 包或 canister 编写可复现的微基准。更多示例见 bench-helper 参考基准仓库;具体运行命令随工具链版本可能不同,请查 README。其余细节资料暂未提供。