Christoph Zurnieden: Grundlagen

Beitrag lesen

Hi,

ja, ich weiß, Du wolltest nicht mehr, aber keine Angst: ich reite auch nicht mehr drauf rum, respektiere Deinen Wunsch.

Vor einer Überpüfung habe ich geglaubt, die neu Funktion scandir() sei eine Erleichterung. Jetzt weiß ich es besser.
wo ist das Problem?

scandir() ist lam gegen while() in Verbindung mit opendir(), readdir() und closedir().

scandir         : 0.050137042999268
while()         : 0.015081882476807

scandir() ist aufwendiger weil es das Ergenis vor der Ausgabe auch noch sortiert. Steht zumindest in der Manpage.

Aber davon ab: was sind das eigentlich für Nummern? Wo kommen die her? Wie lautete der Code für diesen Benchmark? Wie kontrolliert war die Umgebung (Load des Systems)? Was für eine Umgebung? Welche Versionen welcher beteiligter Software? Da es sich zudem um OpenSource-Ware handelt: mit welchem Compiler wie gebaut?

Gut, das sind natürlich die strengen akademischen Bedingungen, die will ich dafür nicht unbedingt ansetzen wollen, aber Du hättest ja zumindest ein paar dürre Worte oder Zeilen Code dazu mitgeben können. So ganz "nackicht" kann man da recht wenig mit anfangen.

Vor einer Überprüfung habe ich geglaubt, mit fgets() bin ich gut bedient. Jetzt weiß ich es besser.
kommt drauf an...

Ja das ist richtig, daher will ich mich präzisieren: fgets() zur Ausgabe des gesamten Inhalts läßt sich einfacher und schneller (je nach dem) über readdir() oder file_get_contents() oder file() erledigen.

fgets() ist eigentlich auch nur zum sequentiellem gepuffertem Dateilesen gedacht, nicht dafür, eine gesamte Datei einzulesen und _nur_ das. Deswegen gibt es ja die anderen Funktionen, die genau für diesen Spezialfall gedacht sind.
Im Bereich in dem PHP am meisten genutzt wird, ist aber normalerweise eh nur die gesamte Datei wichtig, das ist bei PHP also kein Spezialfall mehr, sondern Regel. Deshalb gibt es die entsprechnden Funktionen, die dem Programmierer die Schreibarbeit abnehmen. "Syntactic sugar" wie's so schön heißt, wenn's auch hier nicht stimmt.

count($array) ist eine O(1) Operation. Ein PHP-Array führt intern einen counter mit sich, der bei jeder Änderung aktualisiert wird. Vergleichbares gilt für strlen($string)...

Der Vergleich zweier Integer anscheinend schneller zu sein.

Gibt es auch die dafür nötigen Angaben, damit man das nachvollziehen kann? Zumindest ein kleines Stückchen Code?

Der Vergleich zweier Integer kann je nach Umständen, Architektur und Größe der beteiligten Integer gerade mal zwei Zyklen benötigen. Inklusive Registerladen.
Für die Komplexitätsberechnung ist aber beides O(1), da nur eine Berechnung durchgeführt werden muß: count($array) zählt den internen Counter einen hoch/runter, zwei Integer vergleichen ist aber auch nur - naja, ein einziger Vergleich eben.

so short

Christoph Zurnieden