【问题标题】:Haskell measuring function performanceHaskell 测量函数性能
【发布时间】:2013-03-23 16:26:03
【问题描述】:

在 Haskell 中,我如何“简单地”衡量函数的性能。例如,运行需要多长时间,或者需要多少内存?我知道分析,但是,是否有一种更简单的方法不需要我过多地更改我的代码?

【问题讨论】:

  • 尝试在 GHCI 中设置 :set +s 并调用你的函数。但这仍然没有显示在 ifself 函数中花费了多少时间,而不是在它调用的函数中。
  • 性能分析如何要求您更改代码? Criterion 是一个很好的性能测量库
  • 我如何使用分析来衡量功能性能?这不需要代码更改?对“ghc +RTS -s -RTS -O2 -prof -auto-all Main.hs”的更改?
  • @user2214957 设置编译器选项如何改变代码?
  • -O2编译,用+RTS -s运行,一定要为你的算法测量empirical_orders_of_growth

标签: haskell profiling benchmarking


【解决方案1】:

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

基准测试

这是使用库完成的。 Niklas 在 cmets 中提出了该领域的最终赢家,即Criterion。该库设计得非常好,不难使用,并生成very detailed data

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

您可以找到设置模块的示例here

分析

这方面的好资料已经够多了,我就参考一下吧:

【讨论】:

    【解决方案2】:

    有关各个函数的性能比较的极其粗略的信息,您可以使用 ghci

    Prelude> :set +s
    Prelude> last [1..100000000]
    100000000
    (1.65 secs, 4000685276 bytes)
    

    您需要注意 ghci 不编译代码,因此运行速度比 ghc 慢很多,时间和内存使用数据是近似的,并且绝对没有执行任何优化。 p>

    这意味着它只能让您大致了解代码的效率(低),并且不能替代正确的基准测试和已编译和优化代码的分析,如 Nikita Volkov's answer 中所述。

    【讨论】:

    • 我不得不不同意这个建议;如果代码打算作为编译程序运行,那么它在 ghci 中的执行方式可能会产生严重的误导。我最喜欢的例子是,我遇到过这样的情况,即在 ghci 中运行良好的程序在编译时应用到相同的输入时会产生堆栈溢出。
    • @sacundim 很好的例子,谢谢。出于这个原因,我称它为“非常粗糙”。我在最后添加了更多警告。这个答案是为了指出一个快速而粗略的选择,而不是替换正确的指标。
    • 是的,我知道“非常粗鲁”,但我仍然觉得它可能会误导。我认为,我的例子不言自明。
    • 如果 GHCi 以 -fobject-code 选项启动,或者在 REPL 中输入 *Main> :set -fobject-code,那么它将在加载时编译任何文件。但是,虽然我不确定,但我认为它总是使用-O(而不是-O2)。这样会少一些误导。即使它是编译的,当作为独立的可执行文件运行时,结果也可能很疯狂不同的,尤其是 wrt 内存使用情况。我见过在恒定空间中独立运行的代码,在加载(编译,甚至使用 -O2)到 GHCi 时会消耗数百兆字节。:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2011-12-20
    相关资源
    最近更新 更多