2015-06-13 3 views
6

Кажется, что IO Haskell относительно медленный.Как улучшить производительность Haskell IO?

Например, сравнивая 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 данные в стандартный вывод):

версия

Питон:

$ 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 один намного ниже. Есть ли какие-либо проблемы с моим тестом? Или это просто неотъемлемая проблема Хаскелла?

Спасибо.

+3

Оба раза включает время, необходимое для компиляции программы Попробуйте синхронизацию 'gen.pyc' (предкомпилированным) против скомпилированного двоичного файла от 'io.hs'. – chepner

ответ

6

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

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

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

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 
+0

Обе версии стоят около 520 мс (около 10% улучшения). И я думаю, что ленивый IO устарел из-за способа выпуска ресурсов? http://stackoverflow.com/questions/5892653/whats-so-bad-about-lazy-i-o – sqd

+1

Попробуйте выполнить компиляцию с -O2. –

+8

'runhaskell' всегда медленный, независимо от того, что это за работа. GHC оптимизируется для исполняемых файлов, а не для скорости перевода. –

Смежные вопросы