2011-07-13 8 views
6

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.

+4

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. –

+3

@John L, utilicé '' '--make -fforce-recomp -fllvm'''. Al usar '' '-O2''' como sugirió, ghc está a la par con gcc. Gracias. – edwardw

+0

@edwardw, ¿cuál es su pregunta? – eternalmatt

Respuesta

6

Mi pregunta fue por qué GHC produjo un código tan lento en este caso particular. La respuesta es usar el indicador de optimización, -O, -O2, etc. Al usarlo, vi que el tiempo de ejecución disminuyó de 45+ segundos a 0.6 segundos, ~ 80x de mejora.

Cuestiones relacionadas