2012-08-31 51 views
15

我希望剖析我用Haskell编写的程序。个人档案Haskell没有安装所有依赖项的安装分析库

在编译时,我被告知我没有针对某些依赖性(例如criterion)安装的分析库以及cabal中止。

我对分析这些依赖关系的部分没有兴趣;从main调用的代码甚至不使用它们。

如何在不安装概要分析库的情况下对我的应用程序进行概要分析我不需要并且不移除所有这些依赖关系?

+0

你不能简单地安装它们,什么问题 –

+5

1)我不需要他们,2)安装他们是令人难以置信的繁琐:http://stackoverflow.com/questions/1704421/cabal-not-installing-dependencies-when-needs-profiling-libraries – nh2

+3

尽管我同意这很乏味,但你声称你不需要它们,这显然是错误的。 –

回答

12

一个很好的方法来规避编译一切与分析是使用cabal沙箱。它允许您为一个应用程序设置沙盒,因此您不必重新安装整个~/.cabal前缀。你需要最近版本的Cabal,所以先运行cabal update && cabal install cabal-install

一旦你初始化一个沙箱中,创建一个文件cabal.config,包括必要的指令(在你的情况library-profiling: True; executable-profiling: True也可能派上用场。)

这样做的副作用是,你可以测试你的代码不需要全局安装的依赖关系,例如实验版本或过时版本。

编辑:顺便说一句,我不认为你需要分析启用criterion工作。无论如何,它适用于我没有分析被启用。只需编写一个包含main = defaultMain benchmarksMain模块,其中benchmarks的类型为[Benchmark],即您编写的基准测试列表。

然后,您将这些文件(比如说,我们把它叫做benchmarks.hsghc --make -o bench benchmarks.hs,并运行程序,./bench使用适当的参数(详情参阅标准文档。一个好的默认参数为,说./bench -o benchmarks.html这将产生一个漂亮的?报告类似this one

+0

我猜'命名规范'是暗示错误的事情:它只是我不想分析的依赖项的一个例子。我宁愿说* *“我的应用程序使用'hunit'进行测试,但我不希望自己剖析测试代码,因此希望避免在启用分析功能的情况下安装测试代码”*。 – nh2

+0

这看起来像是一种节省时间的解决方法。 – nh2

+0

如果要比较两个函数*时间*,则条件仅适用。它没有告诉你很多*为什么*你的代码是慢/快的。为了找到内存泄漏或懒惰的thunk,你仍然需要堆分析,这需要'-prof'开关。 –

8

这个星期我有同样的问题,虽然我已经重新编译手的一切,我奉命在IRC频道执行以下操作:

  1. 转到您的小集团配置文件(in case you don't know where)
  2. 编辑该线使库概要(和,而你在它,使文档)
  3. 运行惊天动地安装世界
6

正如你提到的问题中提及在您的评论中,未来解决此问题的一个好方法是在cabal配置中启用分析。这样所有的库都安装了分析支持。这可能不是一个令人满意的解决方案,但我想很多人都选择它。

如果您只想了解程序的内存使用情况,则可以使用-hT生成程序的堆配置文件。更确切地说,您必须编译程序-rtsopts以启用RTS选项,然后使用+RTS -hT执行它。编译器生成一个扩展名为hp的文件。您可以使用hp2pshp文件转换为带有堆配置文件的postscript文件。这应该没有任何分析支持,但请注意,我懒得验证它,因为我已经安装了所有支持分析支持的库; )

+1

已验证,它是真的。 –

+0

哇,你是对的!堆配置文件不需要'-prof',所以如果我只需要空间剖析就不会出现上述问题。尼斯。 – nh2

+3

请注意,这只适用于'-hT',即基于类型的堆分析。还有其他的分析类型,如保留器分析,仍然需要'-prof'。 –