Beiträge mit dem Stichwort ‘Iterator’

PHP: Warum count() im Schleifenkopf langsam ist und … [UPDATE]

Veröffentlicht am 16. August 2010 um 23:41 by Fabian Martin Permalink

In den Kommentaren des ursprünglichen Artikels wurde zu Recht beanstandet, das der Vergleich zwischen for und foreach, so wie er dort beschrieben war, nicht richtig ist, da bei foreach Werte abgefragt werden, die bei den for Schleifen fehlten. Dieser korrigierte Artikel, behebt den Fehler.

Der Artikel wurde zusätzlich mit einem Kommentar zum Thema Optimierung versehen.

Vor ein paar Tagen berichtete ragtek davon, dass count() im Schleifenkopf unschön und ineffizient ist. Beidem kann ich nur zustimmen.

Aber warum ist das so?

Die Erklärung dazu ist einfach. Bei jedem Durchlauf wird count() aufgerufen und darüber die Anzahl der Elemente ermittelt. Überprüfen kann man das Verhalten mit einem kleinen Code Snippet:

<?php
class ArrayTest implements Countable
{
	public $intCountCall = 0;

	public function count()
	{
		$this->intCountCall++;
		return 100000;
	}
}

$objArrayTest = new ArrayTest();
for ($intI = 0; $intI < count($objArrayTest); $intI++)
{

}
echo($objArrayTest->intCountCall . " Aufrufe von count()");

Ergebnis:

100001 Aufrufe von count()

Bei näherer Betrachtung scheint es also logisch, dass diese Variante langsamer ist, als wenn man count() einmal aufruft und den Wert zwischenspeichert.

Ist foreach schneller?
In den Kommentaren wird erwähnt, dass die Verwendung von for und count() unnötig ist, da es ja foreach gibt. Aber ist es auch schneller?
weiterlesen »