Как улучшить производительность Haskell IO?

кажется, что IO Haskell относительно медленный.

например, Сравнение Haskell с Python

#io.py
import sys
s=sys.stdin.read()
sys.stdout.write(s)

,

-- io.hs
main = do
    s <- getContents
    putStr s

их производительность (gen.py записывает данные 512k в stdout):

версия Python:

$ time python gen.py | python io.py > /dev/null

real    0m0.203s
user    0m0.015s
sys     0m0.000s

версия Haskell:

$ time python gen.py | runhaskell io.hs > /dev/null

real    0m0.562s
user    0m0.015s
sys     0m0.000s

кажется, что Haskell намного ниже. Какие-то проблемы с моим тестом? Или это просто неотъемлемая проблема Хаскелл?

спасибо.

1 ответов


ваш пример медленный, потому что он использует ленивый IO с String - s. У обоих свои накладные расходы.

в частности, String является связанным списком Char - s, поэтому он имеет два слова пробелов для каждого символа (одно слово для тега конструктора и одно для указателя вперед), и каждый символ занимает по крайней мере одно слово (одно слово для кэшированных низких символов, три слова для некэшированных символов).

строгий IO с байтом или вводом массива unicode очень быстрее. Попробуйте проверить следующее:

import qualified Data.ByteString as B

main = B.putStr =<< B.getContents

или следующее:

import qualified Data.Text as T
import qualified Data.Text.IO as T

main = T.putStr =<< T.getContents