phpbar.de logo

Mailinglisten-Archive

[php] foreach(array_reverse...

[php] foreach(array_reverse...

Jens Giessmann jg at handcode.de
Don Jan 24 14:01:17 CET 2008


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