Betrachten Sie diesen Codeblock:
%Vor% berechnet die Summe aller Primzahlen unter einer Million. Es dauert 0,468 Sekunden, um das Ergebnis auf meinem Computer zu drucken. Aber wenn die Definitionen von isPrime
und primes
in ein anderes Modul extrahiert werden, ist der Zeitaufwand 1.23 sec, es ist fast 3x langsamer.
Natürlich kann ich die Definitionen überall hin kopieren / einfügen, aber ich bin auch neugierig darauf, warum dies geschieht und wie ich es lösen kann.
[Bearbeiten]
Ich benutze GHC 7.0.3 (Windows 7 + MinGW). Der Code wird in EclipseFP geschrieben (Er verwendet Scion als IDE-Backend) und in eine ausführbare Datei mit -O2
flags integriert.
Ich habe auch versucht, das Paket außerhalb der IDE zu erstellen:
%Vor%Hier ist das Ergebnis:
%Vor% Ich kann das reproduzieren, wenn ich isPrime
und primes
in verschiedene Module lege. (Wenn sie im selben Modul sind, aber immer noch getrennt von main
, sehe ich keinen Unterschied).
Durch das Hinzufügen von {-# INLINE isPrime #-}
wird die gleiche Leistung wie mit allen dreien in einem Modul erzielt. Daher scheint es, als ob GHC in diesem Fall eine Verschiebung für das modulübergreifende Inlining benötigte.
Dies ist auf GHC 7.0.2, Ubuntu 11.04, 64-bit
Laufen Sie das in GHCi oder kompilieren über GHC? Ich habe gerade ein Experiment versucht, indem ich alle Definitionen in der gleichen Datei behalten habe, die ersten beiden verschoben und über GHC mit dem -O-Flag kompiliert habe. Es gibt keinen wahrnehmbaren Unterschied zwischen den verschiedenen Kombinationen auf meiner Maschine (alle laufen nur einige Millisekunden über 1 Sekunde mit GHC 7).
Tags und Links optimization haskell module modularity