Hey da. Heute habe ich ein kleines Benchmark-Skript geschrieben, um die Leistung des Kopierens von Variablen mit dem Erstellen von Referenzen zu vergleichen. Ich hatte erwartet, dass das Erstellen von Verweisen auf große Arrays beispielsweise wesentlich langsamer wäre als das Kopieren des gesamten Arrays. Hier ist mein Benchmark-Code: (!)PHP-Leistung: Kopieren vs. Referenz
<?php
$array = array();
for($i=0; $i<100000; $i++) {
$array[] = mt_rand();
}
function recursiveCopy($array, $count) {
if($count === 1000)
return;
$foo = $array;
recursiveCopy($array, $count+1);
}
function recursiveReference($array, $count) {
if($count === 1000)
return;
$foo = &$array;
recursiveReference($array, $count+1);
}
$time = microtime(1);
recursiveCopy($array, 0);
$copyTime = (microtime(1) - $time);
echo "Took " . $copyTime . "s \n";
$time = microtime(1);
recursiveReference($array, 0);
$referenceTime = (microtime(1) - $time);
echo "Took " . $referenceTime . "s \n";
echo "Reference/Copy: " . ($referenceTime/$copyTime);
Das eigentliche Ergebnis, das ich bekam, war, dass recursiveReference etwa 20-mal dauerte so lange, wie recursiveCopy.
Kann jemand dieses PHP Verhalten erklären?
Abgesehen von der inkorrekten Rekursion, warum überhaupt rekursiv? Warum nicht einfach eine for-Schleife einrichten und die Variablen nach jeder Iteration aufheben (was FAR weniger Overhead haben wird als ein rekursiver Aufruf und nicht den gesamten Speicher auffressen) ... Aber am Ende wird der Unterschied so klein sein, dass In 99,9999% der Fälle ist es sinnvoller, die semantisch passende Zuweisung zu verwenden (Referenz, wo Sie eine brauchen, normal, wo Sie sie nicht brauchen), anstatt zu versuchen, die Mikro-Optimierung zu verwenden. – ircmaxell
Es ging nicht darum, Dinge zu optimieren, ich war nur neugierig. Und ich benutzte Rekursion, weil ich die Vars und die Schleife usw. nicht aufheben wollte. Es war viel schneller eine Rekursion zu schreiben, und mir war der Overhead egal, weil es in beiden gleich war. – fresskoma
Vermeiden Sie große Arrays, um eine gute Leistung zu erzielen. Das ist alles. –