Haskell测量功能性能

10 benchmarking profiling haskell

在Haskell中,我怎样才能"简单地"测量函数性能.例如,运行需要多长时间,或者需要多少内存?我知道分析,但是,是否有一种更简单的方法,不需要我太多地改变我的代码?

Nik*_*kov 18

测量运行所需的时间以及需要多少内存是两个独立的问题,即:基准测试和分析.Haskell为两者提供了一套定义明确的工具.解决这两个问题都需要您对实际应用程序的代码进行任何更改.

标杆

这是使用库完成的.在该领域有一个最终的赢家,这是Niklas在评论中提出的,即Criterion.该库设计得非常好,不难使用并生成非常详细的数据.

工作流程如下:您创建一个单独的模块,其中包含基准测试的设置,编译并使用选项运行它.要获得有关可用选项的参考,请使用--help修饰符运行它.

您可以在此处找到设置模块的示例.

剖析

已经有足够的好材料,所以我只想参考它们:


And*_*ewC 10

有关各个函数相互比较的非常粗略的信息,您可以使用ghci

Prelude> :set +s
Prelude> last [1..100000000]
100000000
(1.65 secs, 4000685276 bytes)
Run Code Online (Sandbox Code Playgroud)

你需要知道,ghci的不编译代码,因此运行比GHC慢,时间和内存使用情况的数据是近似的,而且绝对没有优化已经完成.

这意味着它只能让您非常粗略地了解代码的有效性,并且无法替代正确的基准测试和编译和优化代码的分析,详见Nikita Volkov的答案.

  • 我不同意这个建议; 如果代码是作为编译程序运行的,那么它在ghci中的执行方式可能会产生深刻的误导.我最喜欢的例子是,我已经得到了一些情况,当ghci中运行良好的程序在编译时会产生堆栈溢出,当应用于同一输入时. (3认同)