You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:38:46