2015-06-13 20 views
6

Es scheint, dass Haskell's IO relativ langsam ist.Wie verbessert man die Leistung von Haskell IO?

Zum Beispiel vergleicht Haskell mit Python

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

,

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

Ihre Leistung (gen.py schreibt 512k Daten in stdout):

Die Python-Version:

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

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

Die Haskell-Version:

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

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

Es scheint, dass die Haskell ist weit geringer. Gibt es ein Problem mit meinem Test? Oder ist es nur das inhärente Problem von Haskell?

Danke.

+3

Beide Male sind die Zeit, die das Programm zu kompilieren versuchen Timing 'gen.pyc' (vorkompilierte) vs eine vorkompilierte von 'io.hs'. – chepner

Antwort

6

Ihr Beispiel ist langsam, weil es Lazy IO mit String -s verwendet. Beide haben ihre eigenen Gemeinkosten.

Insbesondere String ist eine verkettete Liste von Char -s, daher hat es zwei Worte Platz Overhead für jedes Zeichen (ein Wort für das Konstruktortag und eins für den Vorwärtszeiger), und jedes Zeichen nimmt mindestens auf ein Wort (ein Wort für zwischengespeicherte niedrige Zeichen, drei Wörter für nicht zwischengespeicherte Zeichen).

Strict IO mit Byte- oder Unicode-Array-Eingabe ist viel schneller. Versuchen Sie Folgendes zum Benchmark:

import qualified Data.ByteString as B 

main = B.putStr =<< B.getContents 

Oder die folgende:

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

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

Beide Versionen kosten ca. 520ms (ca. 10% Verbesserung). Und ich denke, dass faule IO wegen seiner Art, Ressourcen freizugeben, veraltet ist? http://stackoverflow.com/questions/5892653/whats-so-bad-about-lazy-i-o – sqd

+1

Versuchen Sie, mit -O2 zu kompilieren. –

+8

'runhaskell' ist immer langsam, egal was der Job ist. GHC optimiert für ausführbare Dateien, nicht für die Interpretergeschwindigkeit. –

Verwandte Themen