consideran este bloque de código:¿Por qué utilizar funciones definidas en el mismo módulo más rápido que la misma función definida en otro?
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
que calcula la suma de todos los números primos inferiores a un millón. Se necesitan 0,468 segundos para imprimir el resultado en mi máquina. Pero si las definiciones de isPrime
y primes
se extraen en otro módulo, el costo de tiempo es 1.23 segundos, es casi 3 veces más lento.
Por supuesto que puedo copiar/pegar las difusiones donde sea que se requiera, pero también tengo curiosidad sobre por qué esto está sucediendo y cómo resolverlo.
[Editar] estoy usando GHC 7.0.3 (Windows 7 + MinGW). El código está escrito en EclipseFP (usa Scion como back-end IDE) y está integrado en un archivo ejecutable con -O2
flags.
También probé la construcción del paquete fuera del 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
Aquí está el resultado:
$ 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
¡funciona! ¡Gracias! – claude
GHC realizará una alineación muy agresiva dentro de un módulo, especialmente si la función que se va a insertar no se exporta. Es mucho menos entusiasta para alinear funciones a través de los límites del módulo, a menos que INLINE de forma manual. –