Haskell:不同功能组合的性能差异?

以下代码:

import Control.Exception
import Data.List

updateAverage :: (Fractional t) => (t, t) -> t -> (t, t)
updateAverage (old_value, old_counter) x =
    let new_counter = old_counter + 1
    in 
        assert(new_counter /= 0)
        old_value `seq` (old_value + (x - old_value) / new_counter, new_counter)

average values = fst (foldl' updateAverage (0.0, 0.0) values) -- version I

main = do
    let v = [1 .. 1000000]
    let a = average v
    putStrLn (show a)

当用average函数的定义替换时,它变得更快(编译选项: ghc.exe -O3

average = fst . foldl' updateAverage (0.0, 0.0) -- version II

这可能是什么原因? 我认为这两行之间的差异基本上是语法。 第二个版本(没有自由变量values )是否更易于编译器优化?

有趣的是,当没有优化编译时,版本I变得更快。

时间结果:

选项: -O3

版本I:0.280s版本II:0.212s

选项:(不优化)

版本I:0.42s版本II:0.44s

在Cygwin中使用time shell命令进行测量。

时间结果与类型=双:

双:

选项:-O3

版本I:0.22s版本II :: 0.212s

选项:(不优化)

版本I:0.34s版本II:0.35s

更多信息:我正在使用编译器

> $ ghc -v Glasgow Haskell Compiler, Version 7.0.4, for Haskell 98,
> stage 2 booted by GHC version 6.12.2 Using binary package database:
> C:Program FilesHaskell
> Platform2011.4.0.0libpackage.conf.dpackage.cache wired-in package
> ghc-prim mapped to ghc-prim-0.2.0.0-e1f7c380581d61d42b0360d440cc35ed
> wired-in package integer-gmp mapped to
> integer-gmp-0.2.0.3-91607778cf3ae8f3948a50062b4f8479 wired-in package
> base mapped to base-4.3.1.0-f520cd232cc386346843c4a12b63f44b wired-in
> package rts mapped to builtin_rts wired-in package template-haskell
> mapped to template-haskell-2.5.0.0-7d9b1443ac5ab69e5ed705a487990deb
> wired-in package dph-seq not found. wired-in package dph-par not
> found. Hsc static flags: -static
> *** Deleting temp files: Deleting:
> *** Deleting temp dirs: Deleting: ghc.exe: no input files Usage: For basic information, try the `--help' option.
under Cygwin.*

我猜想可能会发生流融合或循环融合。 也许有一个重写规则埋在了Prelude的一个案例中,而不是在另一个案例中。 或者,因为你没有说多快,你可能只是看到缓存效果。

如果你想知道更多,学会钓鱼:

  • 使用ghc -ddump-simpl来查看实际正在生成的代码并进行比较。

  • 使用valgrind来计算正在执行的指令的数量。

  • 如果没有别的,这些工具会给你足够的信息,你可以问一个更有针对性,更详细的问题。

    链接地址: http://www.djcxy.com/p/10539.html

    上一篇: Haskell: difference in performance from different function composition?

    下一篇: Mocha Plugin for Maven