Und wie das miit dem Überprüfen so ist, findet man da selbst auch Fehler. Hier lag er in der Funktion tausch_rakete()
, die bei Copy & Paste mit falschem Inhalt versehen wurde:
function tausch_rakete( $a, $b ) {
$c = ( $b - $a );
}
Korrigiertes Skript:
<?php
$z=1000000;
for ( $i=0; $i<$z; $i++ ) {
$a[$i] = sin($i);
$b[$i] = cos($i);
}
function tausch_rakete( $a, $b ) {
$c = $a; $a = $b; $b = $c; unset( $c );
}
$s = microtime( true );
for( $i=0; $i<$z; $i++ ) {
tausch_rakete( $a[$i], $b[$i] );
}
echo "tausch_rakete:\t" . ( microtime( true ) - $s ) . PHP_EOL;
function tausch_dedlfix( $a, $b ) {
list($a, $b) = [ $b, $a ];
}
$s = microtime( true );
for( $i=0; $i<$z; $i++ ) {
tausch_dedlfix( $a[$i], $b[$i] );
}
echo "tausch_dedlfix:\t" . ( microtime( true ) - $s ) . PHP_EOL;
function cmp_rakete( $a, $b ) {
if ($a > $b ) return -1;
if ($a < $b ) return 1;
return 0;
}
$s = microtime( true );
for( $i=0; $i<$z; $i++ ) {
cmp_rakete( $a[$i], $b[$i] );
}
echo "cmp_rakete:\t" . ( microtime( true ) - $s ) . PHP_EOL;
function cmp_dedlfix( $a, $b ) {
return ( $b - $a );
}
$s = microtime( true );
for( $i=0; $i<$z; $i++ ) {
cmp_dedlfix( $a[$i], $b[$i] );
}
echo "cmp_dedlfix:\t" . ( microtime( true ) - $s ) . PHP_EOL;
Messung auf einem System mit „AMD Ryzen 7 2700 Eight-Core Processor“ und „PHP 7.2.24-0ubuntu0.18.04.4 (cli) (built: Apr 8 2020 15:45:57) ( NTS )“:
tausch_rakete: 0.83518505096436
tausch_dedlfix: 0.90218114852905
cmp_rakete: 0.7413489818573
cmp_dedlfix: 0.68741798400879
Ausgaben auf einem System mit „Cortex-A72“ und „PHP 7.4.4 (cli) (built: Mar 20 2020 14:30:40) ( NTS )“:
tausch_rakete: 0.83518505096436
tausch_dedlfix: 0.90218114852905
cmp_rakete: 0.7413489818573
cmp_dedlfix: 0.68741798400879
Das bereits gezogene Fazit "Tatsächlich! Bezüglich des Vergleiches erscheint Deine Lösung also als etwas performanter." ist trotz des groben Messfehlers richtig.