Archiv für August 2010

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: Warum count() im Schleifenkopf langsam ist und foreach auch

Veröffentlicht am 16. August 2010 um 13:08 by Fabian Martin Permalink

Eine überarbeitete Version des Artikels ist online. Sie berücksichtigt die, in den Kommentaren gemachten, Anmerkungen.

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();

$intStart = microtime(true);
for ($intI = 0; $intI < count($objArrayTest); $intI++)
{

}
echo(microtime(true) - $intStart . " Sekunden\n");
echo($objArrayTest->intCountCall . " Aufrufe von count()");

Ergebnis:

0.069180965423584 Sekunden
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 »

Eclipse: Ordner und Dateien im Windows Explorer anzeigen

Veröffentlicht am 2. August 2010 um 21:56 by Fabian Martin Permalink

Wie oft muss man während der täglichen Arbeit den Explorer in einem bestimmten Projektverzeichnis öffnen? Zumindest so oft, das sich die folgende Konfiguration als sehr nützlich und zeitsparend erwiesen hat.

  • Klickt im Eclipse Fenster auf dem Pfeil, der neben dem Button zum Starten der externen Programme ist (Bild), und wählt “External Tools Configurations…” aus
  • Klickt, in dem neu geöffneten Fenster, das Symbol für einen neuen Eintrag an (1)
  • Gebt dem Eintrag einen Namen (2)
  • Gebt unter Location (3) den Pfad zur explorer.exe an (${env_var:SystemRoot}\explorer.exe)
  • Und unter Arguments (4), mit welchen Parametern der Explorer aufgerufen werden soll. Es empfiehlt sich /select,${resource_loc} dort einzutragen. Hierdurch wird das entsprechende Verzeichnis geöffnet und die ausgewählte Datei markiert.
  • Speichert mit Apply und Close

Ihr habt jetzt einen neuen Eintrag bei den externen Programmen. Wählt nun eine Datei im Project bzw. Package Manager aus und klickt den Eintrag an. Der Windows Explorer sollte aufgehen und die Datei markiert sein.