Почему ввод на основе [Char] так медленнее, чем вывод на основе [Char] в Хаскелле?

Общеизвестно, что для чтения больших объемов данных в Хаскелле не используется [Char] . Для этого используется ByteStrings. Обычное объяснение этому заключается в том, что Chars большие и списки добавляют свои накладные расходы.

Однако, похоже, что это не вызывает никаких проблем с выводом.

Например, следующая программа:

main = interact $ const $ unwords $ map show $ replicate 500000 38000000

занимает всего 131 мс на моем компьютере, в то время как следующая:

import Data.List

sum' :: [Int] -> Int
sum' = foldl' (+) 0

main = interact $ show . sum' . map read . words

занимает 3,38 секунды, если подать выход первой программы в качестве входа!

В чем причина такого несоответствия между производительностью входа и выхода с помощью Строки s?

7
задан Rotsor 22 September 2011 в 05:48
поделиться