Es un conocimiento común que uno no usa [Char]
para leer grandes cantidades de datos en Haskell. Uno usa ByteString
s para hacer el trabajo. La explicación habitual para esto es que Char
s son grandes y las listas añaden su sobrecarga.¿Por qué la entrada basada en [Char] es mucho más lenta que la salida basada en [Char] en Haskell?
Sin embargo, esto no parece causar ningún problema con la salida.
Por ejemplo, el siguiente programa:
main = interact $ const $ unwords $ map show $ replicate 500000 38000000
tarda sólo 131 ms para funcionar en mi equipo, mientras que el siguiente:
import Data.List
sum' :: [Int] -> Int
sum' = foldl' (+) 0
main = interact $ show . sum' . map read . words
toma 3.38 segundos si se alimenta la salida del primer programa como una entrada!
¿Cuál es la razón de tal disparidad entre el rendimiento de entrada y salida usando String
s?
Mi rápido perfil muestra que el programa de entrada asigna 13 veces más memoria que el programa de salida. Esto seguramente contribuye a la disparidad. –