XaraX: Grundlagen

Beitrag lesen

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.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?

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++)

Betrifft unteren Teil

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