Wie läuft mein IO in Erlang so langsam?

8

Ich lese 512 ^ 2 Leerzeichen-getrennte Doubles, die in eine Textdatei geschrieben sind, in mein Erlang-Programm, indem ich sie nach stdin lege.

In Erlang dauert das 2m25s, in einem äquivalenten Haskell-Programm dauert es 3s, also muss ich gegen den Erlang-Weg gehen, es irgendwie zu machen.

Benutzt ich Erlangs IO-Primitive auf eine dumme Weise, oder stimmt etwas anderes mit meinem Programm nicht?

Beachten Sie, dass mir die Reihenfolge der Werte in der resultierenden Liste nicht wichtig ist, also keine umgekehrte Operation.

Erlang:

%Vor%

Haskell:

%Vor%

Vielen Dank für jede Hilfe.

    
Steve Johnson 29.08.2011, 11:22
quelle

1 Antwort

9

Nein, Sie benutzen Erlang IO nicht auf dumme Weise. Es ist ein Problem mit Erlang IO, von dem man nicht weiß, dass es schnell ist. Erlang ist weit verbreitet zum Schreiben von Servern, so dass Socke orientiert IO ist hervorragend abgestimmt. Block-orientierte Datei-IO ist nicht so schlecht, aber die Verwendung von IO-Modul für die Arbeit mit STDIN funktioniert nicht gut. Erlang ist für diese Art von Arbeit nicht weit verbreitet. Wenn Sie diese Art von Operationen benötigen, sollten Sie Ihre eigene spezialisierte Eingabe-Routine schreiben. Sie haben zwei Möglichkeiten:

  1. Verwenden Sie io zum Lesen von Datei im Raw- und Binärmodus und teilen Sie dann die Eingabe mit dem Binärmodul auf und verwenden Sie dann list_to_float/1 für die Konvertierung.
  2. verwendet eine spezialisierte portorientierte stdin-Leseprozedur (wie Sie zum Beispiel in Ссылка Anmerkung read/0 Funktion und -noshell -noinput Parameter für vm Aufruf) und dann wie in der ersten Option fortfahren.

Nach meiner Meinung (und meiner früheren Erfahrung) kommt die größte Auswirkung in Ihrem Fall von der Verwendung einer Scan-ähnlichen Eingangsroutine für die Float-Decodierung, die durch langsamen (wiederholten) Aufruf abgefangen wird, aber es würde ein nicht-triviales Profiling erfordern / p>     

Hynek -Pichi- Vychodil 29.08.2011, 12:20
quelle

Tags und Links