【问题标题】:Writing a time function in Haskell在 Haskell 中编写时间函数
【发布时间】:2010-12-03 18:15:29
【问题描述】:

我是 Haskell 的新手,我希望能够对给定函数调用或代码 sn-p 的运行时间进行计时。

在 Clojure 中,我可以使用“time”:

user=> (time (apply * (range 2 10000)))
"Elapsed time: 289.795 msecs"
2846259680917054518906413212119868890148051...

在 Scala 中,我可以自己定义函数:

scala> def time[T](code : => T) =  {
     |   val t0 = System.nanoTime : Double
     |   val res = code
     |   val t1 = System.nanoTime : Double
     |   println("Elapsed time " + (t1 - t0) / 1000000.0 + " msecs")
     |   res
     | }
time: [T](=> T)T

scala> time((1 to 10000).foldLeft(1:BigInt)(_*_))
Elapsed time 274.292224 msecs
res0: BigInt = 284625968091705451...

如何在 Haskell 中编写等效于我的 Scala 函数或 Clojure 的“时间”的函数?我在 Hackage 上找到的 System.TimeIt module 不够通用,因为它仅在测量 IO 计算时​​才有效。所以timeIt(4 + 4) 不起作用,只有timeIt(print $ 4 + 4),它很快就会变得烦人。另外,我真的很想看看 Haskell 是如何处理一般情况的。

谢谢!

【问题讨论】:

    标签: scala haskell time clojure benchmarking


    【解决方案1】:

    请查看为此使用标准库:

    只需使用标准。


    关于评估深度的说明:懒惰意味着您需要决定在计时运行期间要进行多少评估。通常,您会希望将代码简化为正常形式。 NFData 类型类允许您通过 rnf 方法执行此操作。如果对最外层的构造函数求值没问题,请在纯代码上使用seq 来强制求值。

    【讨论】:

    • 一个 +1 给你 :) 另一个 +1 给 Bryan O'Sullivan 的博客 :)
    【解决方案2】:

    Haskell 是惰性求值的。如果您的表达式没有副作用(如在 IO monad 等中编码),那么程序实际上不需要将表达式解析为值,因此也不会。

    要从中获得有意义的数字,您可以尝试计时 print 4print expr 并取其差,以消除字符串格式化和 IO 的开销。

    【讨论】:

      【解决方案3】:

      懒惰的意思是懒惰。只有在像 IO 这样的 monad 中,时间才是相关的。

      时间在“4 + 4”表达式或任何其他数学方程式中没有任何意义。答案很简单。任何其他纯计算的“答案”在指定计算的那一刻就已经预先确定了。

      很遗憾,这是您问题的“答案”。事实上,在你提出问题之前就已经存在一个答案。当语言最终被定义时,它存在于 1998 年。我花了一年时间写这篇文章的事实并不重要;-)

      好吧,废话够了!!!! (但如果上面的内容太烦人,那就别管 Haskell 了。)

      如果Criterion包太痛苦,写个测试用例,用+RTS测试一下就行了。

      如果您想变得非常酷,请创建您自己的 monad - 计算您的算法执行时间并将结果与​​算法的返回值进行元组处理。祝你好运。我们都在指望你!

      【讨论】:

      • 然而,4+4 实际上并不是一个函数,因为它不需要输入。现在 \x -> x+4 是一个函数。 x 的值可以是任何值。问题是,从知道 x 到知道函数结果需要多长时间。
      • Haskell 并不是在 1998 年“最终定义”的。Haskell 一直在不断发展,因此创建者决定在 Haskell 报告的其中一个版本中添加“Haskell Standard”标签。资料来源:“Haskell 的历史:上课懒惰”
      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多