如何通过Stack的package.yaml配置Haskell基准测试?
当然可以用package.yaml配置Haskell基准测试啦!而且相比直接写cabal文件,它的语法更简洁直观,完全能实现你需要的功能。我给你详细讲清楚配置方法和关键注意事项:
在package.yaml中配置Haskell基准测试
基础结构
基准测试是package.yaml里的顶级字段benchmarks,和library、executables同级。每个基准测试目标的配置逻辑和可执行文件类似,但要加上优化相关的参数——这对基准测试的准确性至关重要。
完整配置示例
假设你的项目名为foo,参考下面的配置:
name: foo version: 0.1.0.0 library: source-dirs: src dependencies: - base >= 4.14 && < 5 benchmarks: foo-bench: source-dirs: bench # 基准测试代码所在目录 main: Main.hs # 基准测试的入口文件 dependencies: - foo # 依赖你的项目主库 - criterion # Haskell最常用的基准测试库 ghc-options: - -O2 # 必须开启:全优化编译,否则基准结果无意义 - -rtsopts # 允许使用RTS运行时参数,比如+RTS -s查看性能统计 - -with-rtsopts=-N # 可选:使用所有可用CPU核心
关键注意事项
- 优化不能省: 一定要在
ghc-options里加-O2——Haskell未优化的代码性能和优化后差距极大,没有优化的基准测试结果完全没有参考价值。 - 依赖主库: 记得把你的项目名(比如这里的
foo)加入dependencies,这样基准测试代码才能导入项目里的模块。 - Criterion代码示例: 在
bench/Main.hs里,你需要用Criterion库定义具体的基准测试用例,比如:
把import Criterion.Main import Foo.MyModule # 导入你要测试的项目模块 main = defaultMain [ bench "耗时函数测试" $ whnf myExpensiveFunction testInput ]myExpensiveFunction和testInput替换成你实际的函数和测试数据即可。
运行基准测试
配置完成后,用以下命令运行所有基准测试:
stack bench
如果有多个基准测试目标,想单独运行某一个,可以指定:
stack bench foo:foo-bench
这种配置方式和你熟悉的cabal文件是一一对应的——Stack在构建时会自动把package.yaml转换成cabal语法。你完全没有遗漏关键功能,只是换了一种更清爽的写法而已。
内容的提问来源于stack exchange,提问作者crisis.sheep
相关产品推荐
相关产品推荐

