Ich schrieb einen Dateiparser in Perl, musste also Datei durchlaufen. Die Datei besteht aus Datensätzen fester Länge, und ich wollte eine separate Funktion erstellen, die den gegebenen Datensatz analysiert und diese Funktion in einer Schleife aufruft. Das Endergebnis wurde jedoch bei großen Dateien langsam und ich vermutete, dass ich keine externen Funktionen verwenden sollte. So habe ich einige Dummy-Tests mit und ohne Funktionsaufruf in einer Schleife:Warum sind Funktionsaufrufe in Perl-Schleifen so langsam?
[A]
foreach (1 .. 10000000) {
$a = &get_string();
}
sub get_string {
return sprintf("%s\n", 'abc');
}
[B]
foreach (1 .. 10000000) {
$a = sprintf "%s\n", 'abc';
}
Measuring zeigte, dass ein Code läuft etwa 3-4mal langsamer als Code B. Ich wusste vorher, dass Code A langsamer laufen sollte, aber ich war überrascht, dass der Unterschied so groß ist. Außerdem wurde versucht, ähnliche Tests mit Python und Java durchzuführen. In Python-Code war ein Äquivalent etwa 20% langsamer als B und Java-Code lief mehr oder weniger mit der gleichen Geschwindigkeit (wie erwartet). Das Ändern der Funktion von sprintf zu etwas anderem zeigte keinen signifikanten Unterschied.
Gibt es eine Möglichkeit, Perl zu helfen, solche Schleifen schneller auszuführen? Mache ich hier etwas total falsches oder ist es Perls Feature, dass Funktionsaufrufe solch ein Overhead sind?
, was genau zu tun ist get_string()? – eruciform
@roe Wir gehen davon aus, dass es sich um einen Stub handelt, und du hast 'sprintf' nicht benutzt, um eine neue Zeile auf eine konstante Zeichenkette zu setzen. Das wäre albern. Was macht es wirklich? – Schwern
seltsam, mein Bildschirm formatiert seltsam, es war nicht vorher da. firefox goof .. – eruciform