Здравствуй, ЛОР! Опять я к тебе с вопросами.
Есть модуль myLen.hs:
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE CPP, MagicHash #-}
{-# OPTIONS_HADDOCK hide #-}
import GHC.Base
main = do
st <- getLine
putStrLn ( show ( mylen [1..rInt st] ) )
mylen :: [a] -> Int
mylen l = len l 0#
where
len :: [a] -> Int# -> Int
len [] a# = I# a#
len (_:xs) a# = len xs (a# +# 1#)
rInt :: String -> Int
rInt = read
Он был откомпилирован командой:
ghc -o l -O2 myLen.hs
А в итоге имеем:
>ghci myLen.hs
GHCi, version 7.2.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Ok, modules loaded: Main.
Prelude Main> :set +s
Prelude Main> main
10000000
10000000
(0.53 secs, 399365024 bytes)
Prelude Main> main
100000000
100000000
(4.66 secs, 4002293340 bytes)
Prelude Main> main
1000000000
1000000000
(50.08 secs, 40000470100 bytes)
Prelude Main> length [1..10000000]
10000000
(1.06 secs, 404952660 bytes)
Prelude Main> length [1..100000000]
100000000
(9.94 secs, 4000357640 bytes)
Prelude Main> length [1..1000000000]
1000000000
(103.70 secs, 40000593384 bytes)
Prelude Main>
Leaving GHCi.
>
Как вообще это понимать? Я так понимаю, стандартная библиотека Prelude тоже откомпилирована? Почему же точно такая же функция из нее работает в 2 раза медленнее? O2 тут не при чем, потому что обнаружил эту хрень я как раз, когда компилировал код без этого флага.