Hallo Christoph,
ja, ich weiß, Du wolltest nicht mehr, aber keine Angst: ich reite auch nicht mehr drauf rum, respektiere Deinen Wunsch.
Mein Wunsch ist es durchaus das ganze nochmal aufzugreifen - allerdings nicht im Theoretischen sondern Praktischem. Sofern haben Deine tiefergehenden Überlegungen allgemeingültig Bestand, daher kann ich Deine Überlegungen auch so stehen lassen.
Ich bin Dir in dem Sinne um jeden Ausreißer dankbar, der sich reproduzieren läßt - allerdings mit dem Zusatz PHP als gemeinsame Basis.
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.015081882476807scandir() 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?
Es sind Zahlen, die die Sekunden eines Durchlaufs ausdrücken.
Wo kommen die her?
Aus einem geparstem Steuerfluß.
Wie lautete der Code für diesen Benchmark?
Erstmalig zusammengefriemelt: http://forum.de.selfhtml.org/archiv/2004/9/t90480/#m542996
In diesem Thread beschrieben: https://forum.selfhtml.org/?t=98391&m=599923
Wie kontrolliert war die Umgebung (Load des Systems)?
Das System steht alleine, Zugriffe fanden nicht statt.
Was für eine Umgebung?
Der obere Test wurde auf einer SuSe 9.1 i586 - Kernel 2.6.5-7.111.19-default auf einem AMD 1200 veranstaltet.
Der Prozess wurde mit env -i gestartet. Weitere laufende Prozesse:
USER PID ACCESS COMMAND
/ root 1 .rc.. init
root 2 .rc.. ksoftirqd/0
root 3 .rc.. events/0
root 4 .rc.. kacpid
root 5 .rc.. kblockd/0
root 6 .rc.. khelper
root 7 .rc.. pdflush
root 8 .rc.. pdflush
root 9 .rc.. kswapd0
root 10 .rc.. aio/0
root 164 .rc.. kseriod
root 355 .rc.. reiserfs/0
root 424 .rc.. kcopyd
root 1114 .rc.. khubd
root 2074 .rc.. login
root 2075 .rc.. mingetty
root 2076 .rc.. mingetty
root 2077 .rc.. mingetty
root 2078 .rc.. mingetty
root 2079 .rc.. mingetty
root 2218 .r... bash
root 2249 .r... fuser
Welche Versionen welcher beteiligter Software?
sh --version //GNU bash, version 2.05b.0(1)-release (i586-suse-linux)
env --version //env (coreutils) 5.2.1
php --version //PHP 5.0.3 (cli) //Zend Engine v2.0.3
Da es sich zudem um OpenSource-Ware handelt: mit welchem Compiler wie gebaut?
Da müste ich jetzt lügen, derzeit habe ich gcc (GCC) 3.3.3 (SuSE Linux) drauf
Parameter waren glaube ich default -O2 -pthread -DZTS
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.
Hallo? Was glaubst Du warum ich das Ferne vor Deiner Diskusion gesucht habe? Weil ich mich durch Theoretisches abgekanzelt fühle.
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.
Na endlich! Darum geht es mir doch die ganze Zeit.
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?
for($i=0;$i<count($a);$i++)
gegen
for($i=0;$i<1536;$i++)
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.
Es bleibt wie gehabt, Querschläger nehme ich sehr gerne zur Kenntnis, um meine Basis wieder zu verbreitern.
Gruß aus Berlin!
eddi