Haskell foldl 'pobre rendimiento con (++)
Tengo este codigo
import Data.List
newList_bad lst = foldl' (\acc x -> acc ++ [x*2]) [] lst
newList_good lst = foldl' (\acc x -> x*2 : acc) [] lst
Estas funciones devuelven listas con cada elemento multiplicado por 2:
*Main> newList_bad [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> newList_good [1..10]
[20,18,16,14,12,10,8,6,4,2]
En ghci:
*Main> sum $ newList_bad [1..15000]
225015000
(5.24 secs, 4767099960 bytes)
*Main> sum $ newList_good [1..15000]
225015000
(0.03 secs, 3190716 bytes)
Por quénewList_bad
función funciona 200 veces más lento quenewList_good
? Entiendo que no es una buena solución para esa tarea. ¿Pero por qué este código inocente funciona tan lento?
¿Qué es este "4767099960 bytes"? Por eso tan simple una operación Haskell usó 4 GiB ??
Después de la compilación:
C:\1>ghc -O --make test.hs
C:\1>test.exe
225015000
Time for sum (newList_bad [1..15000]) is 4.445889s
225015000
Time for sum (newList_good [1..15000]) is 0.0025005s