Следующий код:
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 = fst . foldl' updateAverage (0.0, 0.0) -- version II
В чем может быть причина этого? Я думал, что различия между этими двумя строками в основном заключаются в синтаксисе. Компилятору проще оптимизировать вторую версию (без свободной переменной values
)?
Как ни странно, при компиляции без оптимизации версия I становится быстрее.
Результаты синхронизации:
варианты: -O3
версия I: 0,280 с версия II: 0,212 с
опции: (без оптимизации)
версия I: 0,42 с версия II: 0,44 с
Измерено с помощью команды оболочки time
в Cygwin.
Результаты синхронизации с type=Double:
Double:
опции: -O3
версия I: 0,22 с версия II:: 0,212 с
опции: (без оптимизации)
версия I: 0,34 с версия II: 0,35 с
Дополнительная информация: я использую компилятор
> $ 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.*