Я новичок в Haskell, и меня озадачивает стоимость вызова функции, которая кажется мне совершенно необоснованной, и заставляет меня думать, что я делаю что-то принципиально неправильное.
Рассмотрим следующий код Haskell:
module Main where
logistic x = 4.0*x*(1.0-x)
lg :: Double -> Int -> Double
lg !x 0 = x
lg !x !n = lg (logistic x) (n-1)
main = putStrLn $ show $ lg 0.7861 100000000
Компиляция с помощью команды
ghc -O3 -XBangPatterns -o tsths tst.hs
и запустив его, я получаю:
real 0m15.904s
user 0m15.853s
sys 0m0.016s
Если вместо вызова функции logistic
, я вычисляю выражение inline:
module Main where
lg :: Double -> Int -> Double
lg !x 0 = x
lg !x !n = lg (4.0*x*(1.0-x)) (n-1)
main = putStrLn $ show $ lg 0.7861 100000000
время выполнения:
real 0m0.838s
user 0m0.828s
sys 0m0.004s
что в точности совпадает с эквивалентной программой C, которая является
#include <stdio.h>
int main() {
int i, num=100000000;
double x=0.7861;
for (i=0; i<num; ++i)
x *= 4.0*(1.0-x);
printf("%lg\n", x);
}
Я делаю что-то ужасно неправильно?
Большое спасибо.