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
相关产品推荐
相关产品推荐

