2012-04-13 14 views
19

Ob ich ein Racket-Programm kompiliere oder nicht, scheint für die Laufzeitleistung keinen Unterschied zu machen.Racket Interactive vs Compiled Performance

Wird das Laden der Datei anfangs durch Kompilierung verbessert? Mit anderen Worten, macht das Ausführen von racket src.rkt eine jit Compilation im laufenden Betrieb, weshalb sehe ich keinen Unterschied in kompilieren vs interaktiv?

Selbst für enge Schleifen der Integer-Arithmetik, wo ich dachte, dass ein Unterschied auftreten würde, sind die Profilzeiten äquivalent, ob ich zuvor eine raco make gemacht habe oder nicht.

Fehle ich etwas einfaches?

PS, ich merke, dass ich Schläger gegen die Quelldatei (.rkt) oder .zo Datei ausführen kann. Verwendet Racket automatisch die .zo, wenn eine gefunden wird, die der .rkt Datei entspricht, oder muss die .zo Datei explizit verwendet werden? Wie auch immer, es macht keinen Unterschied zu den Leistungszahlen, die ich sehe.

Antwort

18

Ja, Sie haben Recht.

Racket kompiliert Code in zwei Stufen: Zuerst wird der Code in Bytecode-Form kompiliert, und dann, wenn er ausgeführt wird, wird er in Maschinencode umgewandelt. Wenn Sie eine Datei kompilieren, erstellen Sie im Grunde den Bytecode, der später erneut kompiliert wird. Da dies normalerweise nicht viel Zeit für kleine Codeabschnitte benötigt, werden Sie keinen merklichen Unterschied in den Laufzeiten feststellen. Für ein extremes Beispiel können Sie alle *.zo Dateien im Sammlungsbaum löschen und DrRacket starten - es dauert Los Zeit zu starten, da es eine Tonne Code gibt, aber sobald es beginnt, würde es fast wie üblich laufen . (Es wäre auch langsam, auf "run" zu klicken, da einige Dateien neu geladen und neu kompiliert werden.) Eine weitere Sorge für größere Codeabschnitte ist, dass der Kompilierungsvorgang den Speicherverbrauch erhöhen kann, aber das ist auch kein Problem mit kleineren Codeabschnitten .

Siehe auch die Performace chapter in der Anleitung für Hinweise zur Verbesserung der Leistung.

+0

Vielen Dank, Eli. – Scott

11

Racket kompiliert Ihren Code immer, unabhängig davon, ob er interaktiv bei der REPL ausgeführt wird oder über die Befehlszeile ausgeführt wird. Here ist der Abschnitt in der Anleitung, der es erklärt. Im interaktiven Modus wandelt der Compiler jeden Ausdruck/jede Definition in Bytecode im Speicher um und führt diesen aus. Andernfalls gibt der Compiler den Bytecode an zo-Dateien aus.

Hinweis: Eli antwortete zur selben Zeit wie ich. Siehe seine Antwort für weitere Details.