我希望介绍我用 Haskell 编写的程序。
在编译时,我被告知我没有criterion
安装和cabal
中止某些依赖项(例如 )的分析库。
我对分析这些依赖项的一部分没有兴趣;调用 from 的代码main
甚至不使用它们。
如何在不安装我不需要的分析库且不删除所有这些依赖项的情况下分析我的应用程序?
避免使用 profiling 编译所有内容的好方法是使用 cabal 沙箱。它允许您仅为一个应用程序设置沙箱,因此您不必重新安装整个~/.cabal
前缀。您需要最新版本的 Cabal,因此cabal update && cabal install cabal-install
请先运行。
初始化沙箱后,创建一个文件cabal.config
以包含必要的指令(在您的情况下library-profiling: True
;executable-profiling: True
也可能很方便。)
这样做的副作用是您可以使用不需要全局安装的依赖项来测试您的代码,例如,实验版本或过时的版本。
编辑:顺便说一句,我认为您不需要启用分析criterion
才能工作。无论如何,它适用于我而无需启用分析。只需编写一个Main
包含main = defaultMain benchmarks
where benchmarks
has type的模块[Benchmark]
,即您编写的基准测试列表。
然后编译该文件(例如,我们用 调用它benchmarks.hs
,ghc --make -o bench benchmarks.hs
并使用适当的参数运行程序./bench
(有关详细信息,请参阅标准文档。一个好的默认参数是,比如说./bench -o benchmarks.html
,它将生成一个类似于这个的漂亮报告)
这周我遇到了同样的问题,虽然我手动重新编译了所有内容,但 IRC 频道指示我执行以下操作:
正如您在评论中提到的问题中提到的,将来解决此问题的一个好方法是在 cabal 配置中启用分析。这样,所有库都安装了分析支持。这可能不是一个令人满意的解决方案,但我想很多人都会选择它。
如果您只想了解程序的内存使用情况,您可以使用-hT
. 更准确地说,您必须编译程序-rtsopts
以启用 RTS 选项,然后使用+RTS -hT
. 编译器生成一个扩展名为hp
. 您可以hp
使用hp2ps
. 这应该在没有任何分析支持的情况下工作,但请注意,我懒得验证它,因为我已经安装了所有支持分析的库;)