Рассмотрим этот блок кода:
isPrime primes' n = foldr (\p r -> p * p > n || (n `rem` p /= 0 && r)) True primes'
primes = 2 : filter (isPrime primes) [3..]
main = putStrLn $ show $ sum $ takeWhile (< 1000000) primes
, который вычисляет сумму всех простых чисел ниже миллиона.Для печати результата на моей машине требуется 0,468 секунд.Но если определения isPrime
и primes
извлекаются в другой модуль, временные затраты составляют 1,23 сек, это почти в 3 раза медленнее.
Конечно, я могу копировать / вставлятьРазличия везде, где это требуется, но мне также любопытно, почему это происходит, и как это решить.
[Редактировать] Яиспользуя GHC 7.0.3 (Windows 7 + MinGW).Код написан на EclipseFP (он использует Scion как IDE-сервер) и встроен в исполняемый файл с флагами -O2
.
Я также попытался собрать пакет вне IDE:
executable test
hs-source-dirs: src
main-is: Main.hs
build-depends: base >= 4
ghc-options: -O2
other-modules: Primes
executable test2
hs-source-dirs: src2
main-is: Main.hs
build-depends: base >= 4
ghc-options: -O2
Вот результат:
$ time test/test
37550402023
real 0m1.296s
user 0m0.000s
sys 0m0.031s
$ time test2/test2
37550402023
real 0m0.520s
user 0m0.015s
sys 0m0.015s