Anzeige:
Ergebnis 1 bis 8 von 8

Thema: echo zu lahm....

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615

    echo zu lahm....

    Also - ich hab ne Templateklasse geschrieben, die den ganzem kram am Ende mit

    PHP-Code:
    echo $this->template
    flush(); 
    rauswirft. Das Script welches die Klasse benutzt - ruft den Output ganz am Ende auf. Problem ist jetzt. Auf einer Seite hab ich ne Zeit (für den echo Befehl) von 0.005 sek. Reciht mir auch völlig - aber auf der nächsten Seite hab ich auf einmal eine Zeit (nur für das echo (ohen flush)) eine Zeit von 11.345 sek - Hab mal ein wenig geschaut und gemerkt das es wohl an meiner Verbindng liegt.

    Aber warum macht er die eine Seite so schnell und die andere so lahm.

    Die eine Seite ist 19157 bytes groß und die andere 65281 bytes. (Der String der ausgegeben wird). Aber da passt das Verhältnis ja nicht. Also - warum dauert der Output so lange? Gibt es eine andere Alternative?
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  2. #2
    Registrierter Benutzer Avatar von Gaert
    Registriert seit
    09.05.2002
    Ort
    Nußloch
    Beiträge
    1.317
    Ich schätze, dass es nicht am echo liegt, das so lange dauert, sondern an den Operationen vor dem echo, die halt eine lange Zeit beanspruchen... vielleicht hast du irgendwo einen Flaschenhals in dein Template reinprogrammiert!


  3. #3
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    nee ich habs genau nach gemessen, mit

    PHP-Code:
    $timer->start("REALOUTPUT");
    echo 
    $this->template;
    $timer->end("REALOUTPUT");
    flush(); 
    Das macht eine von mir geschriebene Klasse, die misst das ganze per mircotime, etc pp. Worauf ich hinaus will ich krieg den Großteil 11,2 von 11,25 sek. Ich kann trotzdem grad mal die ganze Funktion reinstellen:

    Bereinigt von der Timer Klasse:
    PHP-Code:
    function echo_template() {
                
    $this->parse_keys();
                
    $this->template stripslashes($this->template);
                
    $this->template str_replace("\\{""{"$this->template);
                
    $this->template str_replace("\\}""}"$this->template);
                
    //@header("Content-Length: ".strlen($this->template));
                
    echo $this->template;
                
    flush();
            } 
    Und parse_keys() zum besseren verständnis auch:

    PHP-Code:
    function parse_keys() {
                
    $this->template str_replace(array_reverse(array_keys($this->keys)), array_reverse($this->keys), $this->template);
            } 
    Ich würde gerne glauben das der Bottleneck woanders sitzt, denn dann könnte man ihn beheben, aber so ist es echt quasi "unbehebbar".
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  4. #4
    Registrierter Benutzer Avatar von Gaert
    Registriert seit
    09.05.2002
    Ort
    Nußloch
    Beiträge
    1.317
    ... Das macht eine von mir geschriebene Klasse, die misst das ganze per mircotime, etc pp. Worauf ich hinaus will ich krieg den Großteil 11,2 von 11,25 sek...
    Sorry aber den Satz raff ich nicht.
    Wo bekommst du die 11,2 Sekunden?

    Ich schätze wirklich , dass deine parse_keys() Methode für eine Exponentielle Lastvergrößerung sorgt, je größer dein keys array ist... schließlich lässt du es ja zweimal komplett umkrempeln...

    Wie groß ist denn das Keys Array beim ersten Aufruf, und wie groß beim zweiten?


  5. #5
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    Also:
    Ich habe ein Klasse "Timer" geschrieben, mit der ich sehr einfach Messen kann. Man macht $timer->start("Bezeichner"); und später $timer->end("bezeichner"); dann hat er die Zeit zwischen start und end gespeichert. und man kann sie mit $timer->dump("bezeichner") wieder abrufen. Das ist aber nebensächlich.

    Ich habe einmal die Laufzeit gemessen, also so:

    PHP-Code:
    include(pfad/timer.php);
    $timer = new Timer();
    $timer->start("RUNTIME");

    /* Do some shit */ 

    $timer->end("RUNTIME");
    $timer->dump(); // Gibt alle gespeicherten Zeiten aus 
    Dann habe ich im Script die Zeile:

    PHP-Code:
    $timer->start("OUTPUT");
    $template->echo_template();
    $timer->end("OUTPUT"); 
    Und echo_template ist halt die obige Funktion als Output erhalte ich in etwa das. Nun starte ich die Hauptseite dann erhalte ich das:

    Code:
    RUNTIME    0.1375
    OUTPUT      0.0354
    REALOUTPUT 0.0005
    Die Werte schön und gut. Klick ich jetzt ein wenig rum und gelange auf eine der nächsten Seiten erhalte ich:

    Code:
    RUNTIME  11.2875
    OUTPUT    10.9554
    REALOUTPUT   10.9268
    Das der Output normalerweise (also Beispiel 1) so "lange" dauert ist mir klar - das liegt an der replace Funktionen. Aber das war schon die schnellste Methode (Hab allerlei ausprobiert aber die waren alle 0.05 - 0.07 langsamer - und das ist inakzeptabel).

    Ich weis das das Problem ein wenig confusing ist. Hoffe trotzdem du verstehst mein Problem jetzt...

    PS: Wie man vielleicht merkt ist Geschwindigkeit mir sehr wichtig - deshalb bin ich für weitere Vorschläge gerne offen [und ich werde sie testen]
    Geändert von mehlvogel (16-12-2002 um 21:29 Uhr)
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  6. #6
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    Was ich gerade bemerkt habe ist, das es wohl Clientabhängig ist - Hier in der Schule wo ich eine schnellere Anbindung habe - brauch die Seite halt keien Elf Sekunden sondern nur zwei aber der output dauert in Relation wieder genauso lange. Es scheint so als wenn der echo wartet bis alles empfangen wurde. Das macht er aber nur bei einigen Seiten nicht bei allen.

    Kann das an einer WEbserver Einstellung liegen (das der Outputbuffer begrenzt ist?) Wenn ja, wie hoch liegt so ein Einstellung, normalerweise.
    Kann ich mit den ob_* Befehlen da evtl was verändern?
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

  7. #7
    Registrierter Benutzer Avatar von Gaert
    Registriert seit
    09.05.2002
    Ort
    Nußloch
    Beiträge
    1.317
    Hmm...

    Falls es wirklich an der größe des Output Buffers liegt, dann könnte ein mehrmaliger aufruf von ob_flush() während des Content zusammenbaus vielleicht wirklich helfen!

    Über SendBufferSize kann man in der httpd.conf auf eine größere Puffergröße festlegen... hab ich aber noch nie ausprobiert!
    http://www.apacheref.com/ref/http_co...ufferSize.html


  8. #8
    Registrierter Benutzer
    Registriert seit
    02.12.2002
    Ort
    Darmstadt
    Beiträge
    615
    Das Problem ist ja, das ich zwischendurch nicht senden kann da ich immer wieder Cookies und Headers (was zum Teufel ist der Plural von header?) verwenden können muss. Der Output darf wirklich erst ganz zum Schluß kommen - hmm vertrackt...
    Seine Rätselhaftigkeit wird nur durch seine Macht übertroffen!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •