[PHP] - Laufzeit & Ressourcen

fliegenkiller

Lt. Junior Grade
Registriert
März 2005
Beiträge
387
Hallo,

Ich habe einige Fragen bezüglich der Laufzeit in PHP.
1. Funktionen und Klassen-Methoden
Wie verhält sich die PHP Laufzeit wenn ich eine Funktion mehrere tausend Mal eine Funktion aufrufen lasse? Klar die Laufzeit nimmt zu, aber was ist, wenn ich eine Klassen Methode die gleiche Anzahl aufrufen lasse? Verhält sich die Laufzeit gleich wie bei den Klassen Methoden in C++ (die ja die gleiche Performance wie sog. Inline Funktionen haben)

2. MySQL Klasse
Wie stark werden die Ressourcen beansprucht, wenn ich Pro seitenaufruf ca. 20 Objekte erzeuge, die jedes mal eine neue Verbindung zum Datenbankserver herstellen? Oder wäre es sinnvoller, wenn ich die Connection Resource als Static-Member speichere und dann bei jedem objekterstellen wieder darauf zugreife?

Besten dank für alle antworten. Sollte etwas nicht klar sein, dann sagt bitte bescheid...
 
Zu ersterem kann ich dir nicht viel sagen, zum zweiten: hängt stark vom Server ab. Allerdings sind 20 Zugriffe pro Seitenaufruf kein sonderlich schwerer Brocken (vrgs. du bekommst ned 2000 Hits in der Sekunde ^^).

Schreib doch eine einfache Mess-Funktion (in SelfPHP ist sowas scho per Mausklick zum Download zu haben) und miss nach, dann siehstes wie das mit Funktionen und Klassenmethoden abläuft. Und Solange der MySQL-Server vlt. eine gute zehntel Sekunde braucht um auf die Anfragen zu antworten bzw. die Daten aufzubereiten, ist auch alled okay.
 
Zu 1.:
Bau dir deinen eigenen Test-Case. Wenn es schon relevant ist, wie lange dein PHP-Script läuft, dann musst du es auch praxisnah testen.

Bau dir das Script und lass es mit einer for-schleife ein paar mal durchlaufen (10^1 bis 10^7) und lass dir die Laufzeiten von Excel in ein Diagramm einzeichnen.

Zu 2.:
Die PHP Ressourcen sind gar nicht soooo wichtig. Das Connection Objekt frisst nicht viel speicher. Jedoch der Client-Prozess auf der Datenbank ist nicht gerade egal. Wenn Verbindungen nicht sauber beendet werden, bleiben die Prozesse zum Beispiel noch Stunden, wenn nicht Tage im Arbeitsspeicher. Da jeder Prozess typischerweise mehrere Megabyte an arbeitsspeicher. So kannst du selbst 1 GB freies RAM sofort voll haben - oder du läufst nach wenigen Minuten gegen die max_connections beschränkung.

Also eine Datenbankverbindung pro Request ist das höchste der Gefühle, was Sinn macht.
 
Hey Danke für die Antworten. Ich werde versuchen ein Script zu bauen, das nur einmal ne Verbindung zum Datenbankserver herstellt. (und es am schluss auch wieder schliesst.)

Danach werde ich noch den Versuch posten mit den Funktionsaufrufen...
 
Hallo,
ich habe mal die Leistungsanalyse mit zwei Funktionen gemacht, je einmal als Funktion und einmal als Metheode einer Klasse. Ich habe die Funktion 1 1000 aufgerufen, in dieser funktion wird 1000mal der Cosinus einer Zufallszahl berechnet.
Ergebnisse:
X-Powered-By: PHP/5.1.1
Content-type: text/html

Objekt Initialisieren
3.6954879760742E-005

Starten der start() methode
0ten Durchlauf bei: 0.00062417984008789
1000ten Durchlauf bei: 11.582193136215
2000ten Durchlauf bei: 23.12709403038
3000ten Durchlauf bei: 34.63035607338
4000ten Durchlauf bei: 46.174650192261
5000ten Durchlauf bei: 57.790342092514
6000ten Durchlauf bei: 69.43514919281
7000ten Durchlauf bei: 80.924001216888
8000ten Durchlauf bei: 92.459331035614
9000ten Durchlauf bei: 103.96913218498
10000ten Durchlauch bei: 115.53924703598

------------------------------------------------------

Aufruf der funktion start()
0ten Durchlauf bei: 0.00082206726074219
1000ten Durchlauf bei: 11.476399183273
2000ten Durchlauf bei: 22.906735181808
3000ten Durchlauf bei: 34.41205906868
4000ten Durchlauf bei: 45.913158178329
5000ten Durchlauf bei: 57.290228128433
6000ten Durchlauf bei: 68.797252178192
7000ten Durchlauf bei: 80.229757070541
8000ten Durchlauf bei: 91.728082180023
9000ten Durchlauf bei: 103.32535219193
10000ten Durchlauf bei: 114.97598719597

Environment: Zend Studio, PHP 5.1.1
Prozessor: Amd Athlon 64 3500+, WinXP Pro
Der Aufruf von Funktionen scheint etwas schneller zu sein, als die Methoden einer Klasse. Jedoch erhielt ich beim pre-test gnau das gegenteil. Ich werde nun morgen noch mit 100000 testen. mehr kann ich fast nicht, da er sonst über 400 minuten benödigt.

Es werden weitere Tests folgen...
 
Ich würde die Rechenaufgabe vereinfachen ;)

Die meiste Zeit braucht hier faktisch das ausrechnen des Cosinus einer Zufallszahl, ned das Aufrufen an sich. Lass ihn was ganz einfaches machen, z.B. eine Funktion, die zu einer Zahl einfach +1 addiert. Diese Funktion (bzw. Methode) rufst du dann 1. Millionen mal auf - da müssten die Ergebnisse klarer sein.
 
Ja das leuchted ein... habe es nochmals gemacht mit der Rechnung i+1 (i wird als Parameter übergeben)
Hier die Resultate: [Angaben in MS]

Mit Objekt Methode
0ten Durchlauf bei: 0.00062203407287598
100000ten Durchlauf bei: 2.2792539596558
200000ten Durchlauf bei: 4.567831993103
300000ten Durchlauf bei: 6.9201989173889
400000ten Durchlauf bei: 9.2037129402161
500000ten Durchlauf bei: 11.503552913666
600000ten Durchlauf bei: 13.763283967972
700000ten Durchlauf bei: 16.012681007385
800000ten Durchlauf bei: 18.255548000336
900000ten Durchlauf bei: 20.509624958038
1000000ten Durchlauf bei: 22.759658098221

----------------------------------

Mit Funktion
0ten Durchlauf bei: 0.00076699256896973
100000ten Durchlauf bei: 2.2058160305023
200000ten Durchlauf bei: 4.425418138504
300000ten Durchlauf bei: 6.6346180438995
400000ten Durchlauf bei: 8.8222041130066
500000ten Durchlauf bei: 11.017163038254
600000ten Durchlauf bei: 13.210390090942
700000ten Durchlauf bei: 15.408272027969
800000ten Durchlauf bei: 17.608711957932
900000ten Durchlauf bei: 19.825125932693
1000000ten Durchlauf bei: 22.022428035736
es scheint, als ob die Funktion etwas schneller arbeitet. Der 0. Durchlauf wird vor dem Eigentlichen funktionsaufruf gemessen..
Weitere tests folgen.
 
Etwas ... ich will meinen dass diese Werte im Bereich der Messungenauigkeit liegen ;)
also 0.0007 Sekunden sind wirklich irrelevant bei 10^6 durchläufen.
 
Ups, da habe ich wohl einen Fehler gemacht... Die angaben sind nicht in Millisekunden sondern in Sekunden. Es hat ja wohl länger gedauert, als einen Augenblick, wenn der Käfer beim Zend mehrmals durchlaufen kann... [Meinfehler]
Unterschied: 0.7s bei 1Million aufrufen...
 
horse.gif
 
Ja das Ziel war es, herauszufinden ob es einen Unterschied zwischen den Funktionen und den Klassenmethoden gibt. In C++ werden die Klassenmethoden als Inline-Funktionen implementiert (in C vergleichbar mit Makros) und haben somit eine wesentlich bessere Performance.
Die Benchmarks haben gezeigt, dass es kaum einen unterschied gibt. Der minime Unterschied kann an der Messtoleranz liegen, da mein PC zum Zeitpunkt des Test nicht vollkommen im Leerlauf war (im Internet surfen).
 
Zurück
Oben