Ich optimiere einen häufig ausgeführten Perl-Code (einmal pro Tag pro Datei).
Verzögern Kommentare die Perl-Skripte? Meine Experimente neigen zu Nein:
%Vor%Gibt fast identische Werte (abgesehen von Rauschen).
%Vor%Ich erhalte ähnliche Ergebnisse, wenn ich die Kommentare und die Versionen ohne Kommentare als separate Perl-Skripte ausführe.
Es erscheint jedoch kontraintuitiv, wenn der Interpreter die Kommentare nicht jedes Mal in den Speicher schreiben muss.
Perl ist eine Just-in-Time-kompilierte Sprache, so dass Kommentare und POD keinen Einfluss auf die Laufzeitleistung haben.
Kommentare und POD wirken sich nur minimal auf die Kompilierzeit aus, aber für Perl sind sie so einfach und schnell, dass es fast unmöglich ist, den Performance-Treffer zu messen. Sie können dies selbst sehen, indem Sie das -c
-Flag zum Kompilieren verwenden.
Auf meinem Macbook benötigt ein Perl-Programm mit 2 Anweisungen und 1000 Zeilen mit 70 Zeichen die gleiche Zeit, um eins mit 1000 Zeilen leerer Kommentare als eins mit nur 2 Druckanweisungen zu kompilieren. Stellen Sie sicher, dass Sie jedes Benchmark zweimal ausführen, damit Ihr Betriebssystem die Datei zwischenspeichern kann. Anderenfalls vergleichen Sie die Zeit, um die Datei von der Festplatte zu lesen.
Wenn die Startzeit für Sie ein Problem ist, liegt das nicht an Kommentaren und POD.
Laufzeitleistung? Nein.
Parsing und Lexing Performance? Ja, natürlich.
Da Perl dazu tendiert, im laufenden Betrieb zu analysieren und zu lexieren, beeinflussen Kommentare die "Start" -Leistung.
Werden sie sich bemerkbar auswirken? Unwahrscheinlich.
Perl kompiliert ein Skript und führt es dann aus. Kommentare verlangsamen geringfügig die Kompilierungsphase, haben aber keine Auswirkung auf die Run-Phase.
Perl ist keine Skriptsprache im selben Sinne wie Shellskripte. Der Interpreter liest die Datei Zeile für Zeile nicht. Die Ausführung eines Perl-Programms erfolgt in zwei grundlegenden Phasen: Kompilierung und Laufzeit [1]. Während der Kompilierungsphase wird der Quellcode analysiert und in Bytecode umgewandelt. Während der Laufzeit wird der Bytecode auf einer virtuellen Maschine ausgeführt.
Kommentare verlangsamen die Parsing-Phase, aber der Unterschied ist vernachlässigbar im Vergleich zu der Zeit, die benötigt wird, um das Skript selbst zu parsen (was für die meisten Programme bereits sehr klein ist). Die einzige Zeit, die Sie wirklich mit Parsing Zeit befassen, ist in einer Webserver-Umgebung, wo das Programm oft pro Sekunde aufgerufen werden konnte. mod_perl existiert, um dieses Problem zu lösen.
Sie verwenden Benchmark
. Das ist gut! Sie sollten nach Möglichkeiten suchen, den Algorithmus zu verbessern - nicht Mikro-Optimierung. Devel :: DProf kann hilfreich sein, um irgendwelche Hotspots zu finden. Sie sollten absolut nicht Kommentare in einem fehlgeleiteten Versuch strippen, um Ihr Programm schneller zu machen. Du machst es einfach nicht erreichbar.
[1] Dies wird allgemein als "just in time" Compilation bezeichnet. Perl hat tatsächlich mehrere Stufen wie INIT
und END
, die hier keine Rolle spielen.
Der Punkt ist: Engpässe optimieren. Das Einlesen einer Datei besteht aus:
Von diesen Schritten ist das Lesen bei weitem der schnellste (ich bin mir nicht sicher, ob es geschlossen werden soll, es ist ein Syscall, aber Sie müssen nicht warten, bis es fertig ist). Selbst wenn es 10% der gesamten Sache ist (was nicht der Fall ist, denke ich), führt eine Reduzierung um die Hälfte nur zu 5% verbesserter Leistung, auf Kosten von fehlenden Kommentaren (was eine sehr schlechte Sache ist). Für den Parser ist das Wegwerfen einer Zeile, die mit # beginnt, keine spürbare Verlangsamung. Und danach sind die Kommentare weg, also kann es keine Verlangsamung geben.
Stellen Sie sich nun vor, Sie könnten den "Lesen im Skript" -Teil um 5% verbessern, indem Sie alle Kommentare entfernen (was eine sehr optimistische Schätzung ist, siehe oben). Wie groß ist der Anteil am "Lesen im Skript" im Gesamtzeitraumverbrauch des Skripts? Hängt davon ab, wie viel es natürlich tut, aber da Perl-Skripte normalerweise mindestens eine weitere Datei lesen, sind es höchstens 50%, aber da Perl-Skripte normalerweise etwas mehr tun, wird eine ehrliche Schätzung dies auf etwas in der Reihe bringen von 1%. So ist die erwartete Effizienzverbesserung durch Strippen aller Kommentare bei am meisten (sehr optimistisch) 2,5%, aber wirklich näher bei 0,05%. Und dann, diejenigen, wo es tatsächlich mehr als 1% gibt, sind schon schnell, da sie fast nichts tun, so dass Sie wieder am falschen Punkt optimieren.
Abschließend, optimieren Sie Engpässe.
Das Benchmark-Modul ist in diesem Fall nutzlos. Es misst nur die Zeiten, in denen der Code immer wieder ausgeführt wird. Da dein Code eigentlich nichts macht, ist das meiste davon weg optimiert. Deshalb läuft es 22 Millionen Mal pro Sekunde.
Ich habe fast ein ganzes Kapitel darüber in Mastering Perl . Der Messfehler in der Benchmark-Technik beträgt etwa 7%. Ihre Benchmark-Zahlen sind darin gut, also gibt es praktisch keinen Unterschied.
Von Paul Tomblins Kommentar:
Führt Perl nicht eine Art On-The-Fly-Kompilierung durch? Vielleicht werden die Kommentare früh verworfen? -
Ja, Perl tut es.
Es ist eine Programmiersprache dazwischen kompiliert und interpretiert. Der Code wird im laufenden Betrieb kompiliert und dann ausgeführt. die Kommentare machen normalerweise keinen Unterschied. Am wahrscheinlichsten ist es wahrscheinlich, wenn Sie die Datei zeilenweise analysieren und vorkompilieren, sehen Sie möglicherweise einen Unterschied von Nanosekunden.
Ich würde erwarten, dass der eine Kommentar nur einmal geparst wird, nicht mehrere Male in der Schleife, also bezweifle ich, dass es ein gültiger Test ist.
Ich würde erwarten, dass Kommentare die Zusammenstellung etwas verlangsamen würden, aber ich erwarte, dass es zu gering wäre, sie zu entfernen.
Verzögern Perl-Kommentare ein Skript? Nun, Parsing, ja. Ausführen nach dem Parsen? Nein. Wie oft wird ein Skript analysiert? Nur einmal, also wenn Sie einen Kommentar innerhalb einer for-Schleife haben, wird der Kommentar einmal von den Parsern verworfen, noch bevor das Skript läuft, sobald es gestartet wurde, ist der Kommentar bereits weg (und das Skript wird intern nicht als Skript gespeichert) Perl), also egal wie oft die for-Schleife wiederholt wird, hat der Kommentar keinen Einfluss. Wie schnell kann der Parser Kommentare überspringen? Die Art und Weise, wie Perl kommentiert wird, ist sehr schnell, daher bezweifle ich, dass Sie es bemerken werden. Sie werden eine höhere Startzeit bemerken, wenn Sie 5 Codezeilen haben und zwischen jeder Zeile 1 Mio Zeilen von Kommentaren ... aber wie wahrscheinlich ist das und für welchen Zweck würde ein Kommentar so groß sein?
Tags und Links perl performance comments