Warum sollten Funktionen, die im selben Modul definiert sind, schneller als die gleiche Funktion in einem anderen Modul sein?

8

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%     
claude 13.09.2011, 12:17
quelle

2 Antworten

7

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

    
hammar 13.09.2011, 12:46
quelle
1

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).

    
Dominic Mulligan 13.09.2011 12:27
quelle