gpt4 book ai didi

performance - Haskell:不同功能组成的性能差异?

转载 作者:行者123 更新时间:2023-12-04 12:42:40 24 4
gpt4 key购买 nike

以下代码:

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)

当我替换 ghc.exe -O3 的定义时变得更快(编译选项: average )功能与
average = fst . foldl' updateAverage (0.0, 0.0) -- version II

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

有趣的是,在没有优化的情况下编译时,版本 I 变得更快。

计时结果:

选项: -O3
第一版:0.280s
版本二:0.212s

选项:(无优化)

第一版:0.42s
版本二:0.44s

使用 time 测量Cygwin 中的 shell 命令。

type=Double 的计时结果:

双倍的:

选项:-O3

第一版:0.22s
第二版::0.212s

选项:(无优化)

第一版:0.34s
版本二: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 Files\Haskell
> Platform\2011.4.0.0\lib\package.conf.d\package.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计算正在执行的指令数。

  • 如果不出意外,这些工具将为您提供足够的信息,您可以提出更集中、更详细的问题。

    关于performance - Haskell:不同功能组成的性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9738790/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com