Beiträge mit dem Stichwort ‘Algorithmus’

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 »

PHP: Algorithmus-Wettbewerb: Spielplan errechnen

Veröffentlicht am 10. Juli 2010 um 07:37 by Fabian Martin Permalink

Vor etwa 2 Wochen hat der PHP Gangsta zu einem neuen Wettbewerb aufgerufen. Es sollen Spielpläne nach einem bestimmten Schema errechnet werden.

Folgende Regeln sind zu beachten:

  • Die Anzahl der Spieler muss gerade sein
  • Es gibt X/2 Bretter und Runden (bei 20 Spielern gibt es 10 Bretter die an 10 Runden bespielt werden)
  • Jede Spielpaarung darf nur einmal vorkommen
  • Jeder Spieler darf nur einmal in einer Runde und an einem Brett spielen (ähnlich Sodoku)

Wenn ihr euch den kompletten Beitrag anseht, findet ihr meine Lösung. Die Berechnung dauert zwischen 3 und 300 Sekunden, und hängt davon ab, wie gut der Zufall mitspielt. Wer das ganze gleich mal testen möchte, kann eines der Ausgabeskripte nehmen, die ihr unter dem Algorithmus findet.

Schaut euch den Code einmal an, vielleicht bekommt ihr ja Ideen für einen eigenen Algorithmus. Noch habt ihr Gelegenheit daran teilzunehmen, denn der PHP Gangsta hat seine Lösung noch nicht veröffentlicht.

weiterlesen »