Mailinglisten-Archive |
Hi, On Thu, Jan 24, 2008 at 10:32:26AM +0100, Thorsten Koch wrote: > > 1. > > foreach(array_reverse($arr) as $ ...) { > > > > 2. > > $arr = array_reverse($arr1); > > foreach($arr as $...) { > > > > > > Verhält es sich hier wie bei count() und Ansatz 2 wäre performanter?! [..] > Aber wie machts der Ami? Learning by doing... also teste es doch > einfach mal :) Genau, einfach mal xdebug trace (o.ae.) anwerfen und schauen was so passiert, alles Andere ist raten/stochern/glaskugeln ;-) Hier mal zu Vergleich die beiden Varianten, jeweils mit folgendem Array: $arr = range(1,1000000); $arr1 = array_reverse($arr); foreach ($arr1 as $key => $value) { ------------------------------------------------------------ TRACE START [2008-01-24 12:16:16] 0.0003 39856 -> {main}() /usr/users/jg/trash.php:0 0.0005 39888 -> range() /usr/users/jg/trash.php:3 0.7856 60234240 -> xdebug_start_trace() /usr/users/jg/trash.php:5 0.7857 60234240 -> array_reverse() /usr/users/jg/trash.php:7 1.5054 104428648 -> xdebug_stop_trace() /usr/users/jg/trash.php:18 1.5055 104428648 TRACE END [2008-01-24 12:16:17] foreach (array_reverse($arr) as $key => $value) { ------------------------------------------------------------ TRACE START [2008-01-24 12:17:26] 0.0003 39696 -> {main}() /usr/users/jg/trash.php:0 0.0005 39728 -> range() /usr/users/jg/trash.php:3 0.8214 60234080 -> xdebug_start_trace() /usr/users/jg/trash.php:5 0.8215 60234080 -> array_reverse() /usr/users/jg/trash.php:13 1.6922 60244328 -> xdebug_stop_trace() /usr/users/jg/trash.php:18 1.6924 60244328 TRACE END [2008-01-24 12:17:28] Man sieht also, beides mal wird die funktion array_reverse() nur einmal aufgerufen, die Sache mit dem count() bezieht sich doch auch auf for() nicht auf foreach, siehe unten. Was ich spannend finde ist, bei der Variante bei der array_reverse() vor dem foreach, ist der Speicherverbrauch hoeher, aber die Ausfuehrungszeit kuerzer. Bei array_reverse() im foreach genau anders rum, weniger Speicher, aber dafuer ein weniger laengere Ausfuehrungszeit. Im Grossen und Ganzen geben sich die beiden Varianten wohl nicht viel. Ich wuerde mich aber wohl eher fuer die Variante mit weniger Speicherverbrauch entscheiden. Ach ja, die Ergebnisse, zumindest die Verhaeltnisse zueinander, sind bei mir reproduzierbar. Der Vollstaendigkeit halber hier noch die beiden trace outputs zum Thema count() und for-Schleifen, das allerdings mit nem deutlich kleineren Array, range(1,10). for ($i = 0; $i < count($arr); $i++) { ------------------------------------------------------------ TRACE START [2008-01-24 12:19:48] 0.0003 39672 -> {main}() /usr/users/jg/trash.php:0 0.0005 39704 -> range() /usr/users/jg/trash.php:4 0.0005 40376 -> xdebug_start_trace() /usr/users/jg/trash.php:6 0.0005 40496 -> count() /usr/users/jg/trash.php:18 0.0006 40496 -> count() /usr/users/jg/trash.php:18 0.0006 40496 -> count() /usr/users/jg/trash.php:18 0.0006 40496 -> count() /usr/users/jg/trash.php:18 0.0006 40496 -> count() /usr/users/jg/trash.php:18 0.0006 40496 -> count() /usr/users/jg/trash.php:18 0.0006 40496 -> count() /usr/users/jg/trash.php:18 0.0007 40496 -> count() /usr/users/jg/trash.php:18 0.0007 40496 -> count() /usr/users/jg/trash.php:18 0.0007 40496 -> count() /usr/users/jg/trash.php:18 0.0007 40496 -> count() /usr/users/jg/trash.php:18 0.0007 40496 -> xdebug_stop_trace() /usr/users/jg/trash.php:23 0.0007 40496 TRACE END [2008-01-24 12:19:48] $count = count($arr); for ($i = 0; $i < $count; $i++) { ------------------------------------------------------------ TRACE START [2008-01-24 12:20:43] 0.0003 39832 -> {main}() /usr/users/jg/trash.php:0 0.0005 39864 -> range() /usr/users/jg/trash.php:4 0.0005 40536 -> xdebug_start_trace() /usr/users/jg/trash.php:6 0.0006 40616 -> count() /usr/users/jg/trash.php:23 0.0006 40672 -> xdebug_stop_trace() /usr/users/jg/trash.php:28 0.0006 40672 TRACE END [2008-01-24 12:20:43] Das ist dann ja wohl selbsterklaerend ;-) Gruss Jens
php::bar PHP Wiki - Listenarchive