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

Cabal文件中能否用变量避免性能分析输出文件被覆盖?

解决方案:避免Cabal Benchmark覆盖性能分析文件

结论

无法直接在.cabal文件中实现动态生成带版本或时间戳的输出文件名——因为Cabal的配置字段仅支持静态字符串,不支持shell变量插值或动态表达式(比如$pkgVer、$datetime这类写法会被当作静态文件名的一部分,不会被解析)。必须借助shell命令或脚本实现需求。

可行方案

方案1:命令行直接传参覆盖RTS选项

先修改.cabal中的ghc-options,保留固定的RTS配置,仅动态传递输出文件名参数:

benchmark bench
  type:                 exitcode-stdio-1.0
  hs-source-dirs:       bench
  main-is:              Main.hs
  default-language:     Haskell2010
  ghc-options:
                        -threaded
                       "-with-rtsopts=-N -p -s -hT -T -i0.1"

之后每次运行时,通过+RTS传入带时间戳的输出路径:

cabal run bench +RTS -pooutput/$(date +%F_%H-%M)

+RTS后的参数会覆盖.cabal中-with-rtsopts对应的配置,生成如output/2024-05-20_14-30.prof、output/2024-05-20_14-30.hp的文件,避免覆盖旧数据。

方案2:用Shell脚本封装(更便捷)

编写一个脚本run-bench.sh,自动处理时间戳和目录创建:

#!/bin/bash
# 生成时间戳
TIMESTAMP=$(date +%F_%H-%M)
# 确保输出目录存在
mkdir -p output
# 运行benchmark并指定动态文件名
cabal run bench +RTS -pooutput/bench_${TIMESTAMP} -N -p -s -hT -T -i0.1

给脚本添加执行权限:

chmod +x run-bench.sh

之后只需执行./run-bench.sh即可自动生成带时间戳的性能分析文件。

可选:加入包版本号

如果需要把包版本也加入文件名,可以通过Cabal命令获取版本并拼接:

#!/bin/bash
PKG_VER=$(cabal info . | grep Version | awk '{print $2}')
TIMESTAMP=$(date +%F_%H-%M)
mkdir -p output
cabal run bench +RTS -pooutput/bench_${PKG_VER}_${TIMESTAMP} -N -p -s -hT -T -i0.1

内容的提问来源于stack exchange,提问作者Ryan de Kleer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:22:48