En su publicación de blog The Glasgow Haskell Compiler and LLVM, David Terei usó un ejemplo que generó una secuencia de granizo para comparar el rendimiento de GHC con C. Decido ejecutarlo y el resultado es increíble: el GHC la versión es más de una magnitud más lenta. El código es bastante inocente:Secuencia de granizo de una magnitud más lenta en haskell que en c
import Data.Word
collatzLen :: Int -> Word32 -> Int
collatzLen c 1 = c
collatzLen c n | n `mod` 2 == 0 = collatzLen (c+1) $ n `div` 2
| otherwise = collatzLen (c+1) $ 3*n+1
pmax x n = x `max` (collatzLen 1 n, n)
main = print . solve $ 1000000
where solve xs = foldl pmax (1,1) [2..xs-1]
excepto sustituyendo foldl
con foldl'
, no creo que pueda hacer nada con él. ¡La versión de GHC encuentra la respuesta en más de 45 segundos, sin importar qué back-end use, mientras que la versión C solo usa 1.5 segundos!
Mi configuración es la plataforma Haskell 2011.2.0.1 (32 bits) + OS X 10.6.6 frente a gcc 4.2.1. David usó GHC 6.13 en su publicación. ¿Es este un error conocido de GHC 7.0.3? O debo haberme perdido algo muy obvio.
EDITAR: Resulta que me perdí algo obvio. Simplemente usando la bandera -O2
, ghc produce código muy rápido ahora.
que banderas de compilación estás usando? Para mí, este código se ejecuta en 4s cuando se compila con 'ghc-7.0.4 -O2'. '-O' es solo un poco más lento. –
@John L, utilicé '' '--make -fforce-recomp -fllvm'''. Al usar '' '-O2''' como sugirió, ghc está a la par con gcc. Gracias. – edwardw
@edwardw, ¿cuál es su pregunta? – eternalmatt