2015-06-13 19 views
6

Haskell'in IO'sunun nispeten yavaş olduğu görülüyor.Haskell IO'nun performansı nasıl geliştirilir?

Python versiyonu:

Python

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

ile Haskell karşılaştırılması Örneğin

,

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

Performansları (gen.py stdout'ta içine 512k verileri yazar)

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

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

Haskell sürümü:

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

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

Haskell biri kadar düşük olduğu görülmektedir. Testimle ilgili bir problem var mı? Yoksa sadece Haskell'in doğal sorunu mu?

Teşekkürler.

+3

İki kere program derlenmiş ikili vs 'zamanlama gen.pyc' (hazır) deneyin derlemek için gereken süreyi kapsar aşağıdaki kriter deneyin io.hs' dan. – chepner

cevap

6

Örneğiniz yavaştır çünkü tembel IO'yu String -s ile kullanır. Her ikisinin de kendi genel yükleri vardır.

Özellikle StringChar -s'nin bağlı bir listesidir, bu nedenle her karakter için iki karakterlik boşluk eki vardır (yapıcı etiket için bir sözcük ve ileri işaretçi için bir sözcük) ve her karakter en az tek kelime (önbelleğe alınan düşük karakterler için bir kelime, önbelleğe alınmamış karakterler için üç sözcük).

Bayt veya unicode dizi girdisi ile sıkı IO çok daha hızlıdır.

import qualified Data.ByteString as B 

main = B.putStr =<< B.getContents 

Veya aşağıdaki:

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

main = T.putStr =<< T.getContents 
+0

Her iki sürüm de yaklaşık 520 ms'dir (yaklaşık% 10 iyileştirme). Bence tembel IO, kaynakları serbest bırakmanın yolu yüzünden kullanılmıyor mu? http://stackoverflow.com/questions/5892653/whats-so-bad-about-lazy-i-o – sqd

+1

-O2 ile derlemeye çalışın. –

+8

'runhaskell', iş ne olursa olsun her zaman yavaştır. GHC, tercüman hızını değil, yürütülebilir dosyaları optimize eder. –

İlgili konular