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