Warum ist dieses einfache Textanalyseprogramm so langsam?

8

Dies ist mein Code zum Zählen von Zeilen und Wörtern:

%Vor%

Dies dauert ungefähr 10 Sekunden, um mit einer Datei von ungefähr 100 Megabyte zu laufen. Ich habe es mit ähnlichen Programmen in Lua (9s), awk (20s) und wc -l -c (0.6s) verglichen.

Warum ist dieser Code so langsam? Was könnte das Problem sein?

    
vzex 02.04.2012, 14:33
quelle

1 Antwort

15

I / O mit String ist in Haskell bekanntermaßen weniger als schnell. Die vom Handle gelesenen Bytes müssen im Allgemeinen in Unicode-Codepunkte konvertiert werden, und dann wird daraus eine verkettete Liste gebildet. Das ist eine Menge Arbeit, die viel Zuteilung verursacht. In diesem Fall ist die Umwandlung in Codepunkte etwas einfacher, da Sie stdin in den binären Modus setzen, aber die Konstruktion der verketteten Liste von Zeichen dauert immer noch eine Menge Zeit.

Ein weiterer kleiner Faktor ist, dass Ihre Zeilenanzahl Integer verwendet, aber das ist geringfügig und spielt nur eine wichtige Rolle, wenn die I / O auf Hochtouren läuft.

Wenn Sie schnelle E / A benötigen, müssen Sie einen Typ verwenden, der besser dafür geeignet ist. Eine Möglichkeit ist die Verwendung von ByteString , zum Beispiel

%Vor%

erledigt den Job in einer 94MB-Datei in 0,12s auf meiner Box (wc -l -c nimmt 0,06s), während das Original mit String 4,4s benötigte. Es kann weiter optimiert werden,

%Vor%

dauert nur 0.08s, was anständig genug ist, damit ich nicht mehr optimieren kann (eine ähnliche Änderung für die String Version bringt die Zeit dafür auf 3.6s).

    
Daniel Fischer 02.04.2012, 15:25
quelle

Tags und Links