Warum hat -O2 einen so großen Einfluss auf einen einfachen L1-Entfernungsrechner in Haskell?

9

Ich habe einen einfachen L1-Entfernungsrechner mit Haskell implementiert. Da ich mich für Performance interessiere, habe ich ungepackte Vektoren verwendet, um die Bilder zum Vergleich zu speichern.

%Vor%

Nach dem, was ich weiß (ich bin neu bei Haskell), sollte die Stream-Fusion diesen Code als einfache Schleife laufen lassen. Also sollte es schnell gehen. Die Leistung erwies sich jedoch als gering, wenn sie mit

kompiliert wurde %Vor%

Das Programm hat ungefähr 60 Sekunden gebraucht:

%Vor%

Allerdings hat sich die Performance beim Kompilieren mit

drastisch erhöht %Vor%

Die Laufzeit ist auf ungefähr 13 Sekunden gesunken:

%Vor%

Der Effekt ist noch stärker, wenn größere Teile der Bildsätze verwendet werden, da das Laden von Bildern einen geringeren Teil der Laufzeit beansprucht. Laut HaskellWiki gibt es praktisch keinen Unterschied zwischen -O und -O2 ( Ссылка ). Ich beobachte jedoch einen großen Effekt. Ich frage mich, ob ich etwas vermisse. Gibt es eine Optimierung meines Codes, die der Compiler (GHC) beim Kompilieren mit -O2 durchführt? Wenn ja, was macht er? Nach dem, was ich gelesen habe, kommt die Hauptleistungsverbesserung von der Stromfusion und von mir sieht die Funktion aus, wie Stromverschmelzung angewandt werden kann.

Als Referenz finden Sie hier das vollständige Beispiel für mein Testprogramm.

%Vor%     
Oliver Gerlach 09.05.2017, 09:55
quelle

0 Antworten