Ladezeit PHP-File messen

recotha

Aktives Mitglied
hallo!
ich habe zwecks sprachlicher unterscheidung in einem php-file zwei versionen des contents, und zeige mittels IF und ELSE folglich nur eine version an.
wie wirkt sich das auf die ladezeit des files aus?
alternativ könnte ich ja die beiden versionen separat abspeichern, und bei der abfrage entweder das eine oder das andere file inlcuden. macht dies in bezug auf ladezeit des files einen wesentlichen, für den user feststellbaren unterschied in der geschwindigkeit des seitenaufbaus aus?
gruss
reoctha
 
Florians Antwort, dass du messen solltest finde ich richtig.

Interessanterweise kann das Aufteilen auf 2 files sowohl langsamer als auch schneller sein.
 
Das kann jetzt nicht Euer Ernst sein hier oder? Oder wollt Ihr Entchen zählen?

Zum ersten mal, die Ladezeit per PHP messen zu wollen kannst Du gleich vergessen. Das liegt daran, dass das Script erst abgearbeitet wird, wenn es vollständig in den Arbeitsspeicher geladen ist. Das heisst, Du kannst dann keine Ladezeit mehr messen. Es liegt nun mal in der Natur der Dinge, dass so ein Script sehr zerstückelt auf der Festplatte liegt, man nennt das fragmentiert. Die API des Servers muss nun die Adressen jedes einzelnen Segmentes des Scripts aus der File Allocation Table der Harddisk erfragen. Das führt dazu, dass z.B. die Zeilen 17 - 23 des Scripts bereits im Arbeitsspeicher bereit liegen während die Zeilen 7 - 11 noch nicht mal gefunden wurden.

So, wenn nun das ganze Script im RAM bereit liegt, kannst Du eine ungefähre Messung vornehmen, wie lange gebraucht wird, um das Script abzuarbeiten. Warum nur ungefähr? Ganz einfach: Zu dem Zeitpunkt, wenn Du die Serverzeit erfragst, hat die Abarbeitung des Scripts längst begonnen. Das wäre, als würdest Du beim Formel1-Rennen erst in der 5. Kurve die Stoppuhr starten. Am Ende des Scriptes nimmst Du nochmal die Serverzeit. Danach subtrahierst Du die Startzeit von der Endzeit und gibst die Differenz per print oder echo aus. Das heisst, das Script wird weiter abgearbeitet, obwohl Du die Uhr bereits gestoppt hast. Beim Formel1 wäre das so wie, die Uhr 3 Kurven vor der Zielgeraden anzuhalten. Bedenke, wir sprechen hier von Bruchteilen von Millisekunden.

In einer If-then-else-Schleife wird das jeweils nicht benötigte übersprungen, also nicht ausgeführt. Trotzdem muss der zu überspringende Teil komplett im Arbeitsspeicher vorhanden sein.

Wie kommt denn nun genau ein Script in den Arbeitsspeicher? Ein Rechner verhält sich hier wie die Post: Nimm eine Nummer, wenn Deine Nummer aufgrufen wirst, bist Du dran. Also wartest Du jetzt erstmal. Wenn Du endlich dran kommst, wirst Du ständig unterbrochen, weil der Rechner ja gleichzeitig mehrere tausend mal pro Sekunde alle 108 Tasten Deiner Tastatur nach Veränderungen abfragen muss und mehrere tausend mal pro Sekunde die Maus abfragen und mögliche Veränderungen verarbeiten und viele weitere Aufgaben erledigen muss. Die Festplatte selbst ist dann das Langsamste, was Du Dir vorstellen kannst. Zum ersten müssen zig tausend Zeilen Maschinencode abgearbeitet werden, bis die Festplatte nur mal zugibt, dass sie existiert. Dann hat eine Festplatte wesentlich höhere Zugriffszeiten als das RAM. Dann müssen die Daten von der Festplatte durch den ständig verstopften Flaschenhals des Bussystems geschleust werden. Da geht Zeit verloren, das glaubst Du nicht.

Trotz alledem ist der Server immer noch sauschnell. Jetzt kommt nämlich das, was wirklich Zeit braucht: Der fertige HTML-Code, frisch vom Server anhand des Scriptes erstellt, muss zum Browser des Users. Aufgeteilt in kleine Pakete wird der HTML-Code auf die Reise geschickt. So kann es sein, das Teile des Bodys sich bereits beim User rumlangweilen, während ein Teil des Headers noch in Rom in einer Warteschleife steht.

Willst Du also wirklich präzise eruieren, was schneller geht, dann musst Du Dir einen Server aufsetzen, der nichts anderes zu tun hat, als Dein Script auszuführen. Der Server Deines Hosters hat ja nun leider auch noch andere Kunden zu bedienen als nur Dich. Anyway, so ein klinisch reiner Server ist sowiso nur theoretisch möglich.

Wenn Du das alles jetzt nicht glauben willst, dann probier es aus: Dieses Forum zeigt in der Fusszeile wie lange das Script benötigt hat um den HTML-Code bereitzustellen. Du kannst mehrere Male reloaden und wirst jedes Mal eine andere Zeit erhalten, im Millisekunden-Bereich wohlgemerkt. Dahingegen der Aufbau der Seite in Deinem Browser dauert unsäglich viel länger, also so eine bis zwei ewig lange Sekunden kann das schon gehen.

Was machen wir jetzt? Ich sags Dir: Guten und inhaltlich interessanten Content schreiben und ein Augenmerk darauf legen, dass er in beiden Sprachversionen sowohl orthographisch als auch grammatikalisch sauber ist. Das bringt mehr Sinn, als darüber zu hirnen, wo man noch ein Millisekündchen sparen könnte.

smile.gif
 
Also ich zähle ja eigentlich ganz gerne Entchen 

Aber im Ernst, ganz trivial muss die Entscheidung nicht sein.

Du hast sicher recht, das man nicht mit php selbst auf einem Server, der gleichzeitig x Seiten bedient, eine gute Testumgebung darstellt.

Abzuschätzen, ob z.B. ein include länger braucht als ungenutzte Funktionen im ausgeführten File immer zu haben ist gar nicht so leicht.

Meiner Erfahrung nach ist das aber im Vergleich zu den anderen Stellen die man optimieren kann eigentlich wirklich egal.

Einen ganz guten Artikel gibt es unter, geht aber mehr um Servertuning:
http://phplens.com/lens/php-book/optimizin...bugging-php.php

Immer wieder interessant:
http://www.zend.com/zend/tut/index.php

 
Hallo...

wie du den php source schreibst ist ja nun wirklich egal ausser du hast milionen von zugriffen und du machst nicht unnötige schleifen.

was da wichtiger ist, dass du die mysql abfragen optimierst.
 
@hamlet
sehr ausführliche schilderung, danke!

@beni
was verstehst du unter mysql-abfragen optimieren?
hättest du einen vergleich von einer schlechten abfrage und einer optimieretn?
 
mysql abfragen optimieren:

wenn du verknüpfte abfragen zwischen tabellen machst, kannst du das z.b. auf php-ebene oder auf mysql eben machen. php ebene:

// erste abfrage
$mysqlTodo1 = "
select dept_id from dept
";

$mysqlResult1 = mysql_query($mysqlTodo1);

while($mysqlVar1 = mysql_fetch_assoc($mysqlResult1))
{

echo "das department ".$mysqlVar1["dept_id"]." hat folgende mitarbeiter:<br>";

// zweite abfrage
$mysqlTodo2 = "
$select * from emp where dept_id = '".$mysqlVar1["dept_id"]."'
";

$mysqlResult2 = mysql_query($mysqlTodo2);

while($mysqlVar2 = mysql_fetch_assoc($mysqlResult2))
{
echo $mysqlVar2["emp_id"]."<br>";
}

}

oder du kannst das mit einem join lösen:

select * from dept
join emp on emp.dept_id = dept.dept_id

***

das nur so als "in etwa", wie man eine abfrage optimieren kann, schliesslich ist es doch unsinnig, abfragen in php zu steuern, wenn mysql (bzw sql allgemein) optimierte befehle dafür kennt. in php scheint es erst zwar viel einfacher (was es evtl auch ist), aber in performance fragen siehts dann anders aus.

ein weiteres beispiel ist auch, dass man beim select statement kein wildcard benutzt, wenn man nur eine oder zwei spalten abfragen will:

select * from dept

ist viel langsamer als

select dept_id from dept

was natürlich nur bei grosser anfrage wirklich eine rolle spielt.

ich hoffe, das hilft dir etwas und ich habe den ganzen sh*t nicht umsonst geschrieben.
wink.gif


gr33tz
j0sh
 
vielen dank josh, das mit dem JOIN ist sehr hilfreich für mich. habe mich schon ein wenig mit datenmodellierung befasst da ich abhängigkeiten zwischen diversen db-tables habe, und bin noch auf keine "einzeiler-lösung" gekommen!
danke!
 
kein problem, ich selber habe lange zeit mehr ahnung von von joints als von joins gehabt
biggrin.gif
, doch als wir sie in der schule gelernt hatten war ich sehr froh um dieses neue wissen. ich rate dir, die verschiedenen joins genau zu lernen (hast du einen begriffen, sind die anderen 2-3 kein problem mehr). stichworte: inner (default) / outer join, => verbunden mit left / right / natural join. sieht komplex aus, ist aber relativ simpel.
smile.gif
 
Zurück
Oben