| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| Neuer Benutzer Registriert seit: 05.03.2011
Beiträge: 16
PHP-Kenntnisse: Fortgeschritten ![]() | Hallo zusammen, hab' mich hier grad mal registriert und hoffe Ihr könnt mir helfen. /e: Bin am Ende etwas ausgeschweift. Ich hoffe ihr könnt mir trotzdem irgendwie helfen und mich aufklären! Vielen Dank! Der Hintergrund meiner Frage ist ein relativ starkes Performance-Problem in einem von mir entwickelten ORM-Framework. Ich versuche die Performance-Fresser mit Xebug zu finden und bin dabei auf ein grundsätzliche Problem gestoßen, was ich in folgendem Beispiel zeigen möchte. Es würde mich freuen, wenn es mir jemand erklären kann. Hier der Php-Code: http://paste.pocoo.org/show/348178/ Und hier nun die XDebug-Analyse mit Webgrind dargestellt: http://static.laszlokorte.de/images/...a8e45bd0b2.png Wie kann es sein, dass die SelfCost von testrunner() nahezu genau so groß ist, wie die selfcose von testme(), obwohl in testrunner nur eine schleife von 1-20000 zählt, aber in testme() ein Objekt initialisiert wird? Wenn testme() nur ein string zurück gibt, sinkt auch die selfcost von testrunner, obwohl testrunner ja immer noch das gleiche macht: eine forschleife durchlaufen. Kann ich irgendwie sehen, wofür die Zeit in testrunner() genau benötigt wird wird? das $i++ und das $i<20000 wird es ja wohl kaum sein. Man könnte vermuten, dass das erzeugen der Variable mit dynamischen Namen die Zeit kostet, aber das kann ja nicht sein, da ja die selfcose von testrunner() sich ja stark verringert, wenn testme() kein Objekt mehr zurück gibt. Mir scheint es fast als wenn Php auf Grund irgendeines Fehlers extrem lange braucht um mit Objekten umzugehen oder xDebug misst irgendetwas falsch. Geändert von laszlokorte (06.03.2011 um 15:22 Uhr). |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | ||
| Moderator und Wett-König | Zitat:
Weiterhin habe ich bei der Entwicklung des öfteren festgestellt, dass eine Methode u.U. auch eine Kopie erhält, wenn der Referenz-Operator fehlt. Ob das in 5.3. auch noch so ist, habe ich nicht mehr getestet, dafür hat 5.3. nun andere Probleme.
__________________ Viele Grüße, Dr.E. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Think about software design before you start to write code! 2. Discuss and review it together with experts! 3. Choose good tools (-> Adventure PHP Framework (APF))! 4. Write clean and reusable software only! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Was ist denn (unter PHP5) eine Kopie eines Objekts? Ein Klon? Zitat:
Das dürfte ein Integer sein. Ich könnte mir höchstens vorstellen, dass die unterschiedliche Laufzeit bei Rückgabe eines Strings/Objekts irgendwas mit copy-on-write, also Memory Sharing, zu tun hat. Ich habe hier gerade keine wirkliche Testumgebung installiert, aber was passiert denn, wenn in testme() immerzu ein unterschiedlicher String zurückgegeben wird? Vielleicht einfach per statischer Variable hinten ein $i dranhängen oder so. | |
| | |
| | |
| Moderator und Wett-König | Ich habe innerhalb von Baum-Strukturen die Erfahrung gemacht, dass ein PHP-Code: PHP-Code:
__________________ Viele Grüße, Dr.E. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Think about software design before you start to write code! 2. Discuss and review it together with experts! 3. Choose good tools (-> Adventure PHP Framework (APF))! 4. Write clean and reusable software only! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() | Das kann aber kaum in PHP 5 passiert sein oder? Das Objekt müsste ja tatsächlich aus heiterem Himmel geklont worden sein. Und lass uns mal um Verwirrungen vorzubeugen bei der korrekten Terminologie bleiben und in Zusammenhang von Objekten nicht von Kopien und Referenzen sprechen, wenn es nicht wirklich um Referenzen auf Objekt-Identifier geht. |
| | |
| | |
| Neuer Benutzer Registriert seit: 05.03.2011
Beiträge: 16
PHP-Kenntnisse: Fortgeschritten ![]() | Ok, vielen Dank schon mal für die Antworten. @ dr.e. Ich werd das mal Testen, kann es mir aber absolut nicht vorstellen. Von welcher Php-Version sprichst du denn? Es dürfte ja nur 4.x sein. @mermshaus die Idee mit dem Copy-on-Write hatte ich auch schon und habe darauf hin in testme() noch eine Property des Objekts gesetzt bevor es zurückgegeben wurde. Das hatte aber an der Laufzeit nicht wirklich was geändert. Was passiert, wenn testme() einen dynmischen String zurück gibt, habe ich noch nicht probiert. Das mit der Kopie der Referenz-Id habe ich zwar nicht gewusst, aber verstehe auch nicht wie daraus die Performance so stark beeinflusst werden soll, denn vom Aufwand her müsste es ja nicht mehr sein, als den String zu kopieren (ok, wie gesagt hab ich verschiedene Strings noch nicht getestet). Geändert von laszlokorte (07.03.2011 um 15:58 Uhr). |
| | |
| | |||
| Erfahrener Benutzer Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Die Aussagen hier sind auch ausschließlich zu PHP5(.3). Zitat:
Zitat:
Schade eigentlich. Was die Sache mit den Referenzen angeht, die inzwischen auch nicht mehr hier steht ( Ich glaube nicht, dass das Kopieren des Object Identifiers beziehungsweise das Setzen einer Referenz auf diesen einen spürbaren Einfluss auf die Laufzeit hat. Spontan würde ich sogar behaupten, dass das Setzen der Referenz einen Tick langsamer ist. Unter PHP5.3 sehe ich kaum einen Grund, im OOP-Bereich mit Referenzen zu arbeiten. Abgesehen vielleicht vom Ausnutzen von Seiteneffekten bei Methodenaufrufen. Es mag dafür sinnvolle Beispiele geben, aber spontan würde ich sagen: code smell. Referenzen auf Objektvariablen (Variablen, die einen Object Identifier enthalten) funktionieren jedenfalls exakt so wie Referenzen auf primitive Variablen. Beide Symbole zeigen gleichberechtigt auf denselben Object Identifier. Bei einer „Kopie“ der Objektvariablen ohne Referenz erhält jedes Symbol eine Kopie des Object Identifiers. Deshalb ist der Methodenaufruf mit einem Objektparameter auch generell call-by-value. Geändert von mermshaus (07.03.2011 um 16:30 Uhr). | ||
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Problem mit Basedir in PhP | cmuch05 | Datenbanken | 9 | 08.01.2009 14:17 |
| [Erledigt] Problem: PHP Selbe Datei mehr als 1 Mal | soulan | PHP Tipps 2008 | 13 | 28.11.2008 22:51 |
| Problem Upload mehrere Dateien und schreiben in DB | Lapje | PHP Tipps 2008 | 1 | 22.10.2008 13:12 |
| utf8 Problem (Daten aus DB auslesen) | go1denboy | PHP Tipps 2008 | 1 | 23.09.2008 12:19 |
| Problem mit swfobjects | R4v3r | JavaScript, Ajax und mehr | 8 | 21.09.2008 14:17 |
| [Erledigt] Galerie Problem... | coraplanet | PHP Tipps 2008 | 4 | 06.06.2008 13:42 |
| performance problem mit join | leo | Datenbanken | 4 | 14.01.2008 22:31 |
| ImageMagick Performance Problem | M3g4Star | PHP Tipps 2006 | 1 | 30.11.2006 09:35 |
| performance probleme in der community | phoetron | PHP-Fortgeschrittene | 15 | 25.07.2006 08:37 |
| datensätze defekt oder problem mit dem einlesen? | Ministry | Datenbanken | 4 | 06.07.2006 18:42 |
| problem!!! | PHP Tipps 2006 | 6 | 08.02.2006 11:06 | |
| [Erledigt] wieder ein Problem bei phpmailer und smtp | PHP Tipps 2006 | 24 | 07.02.2006 01:07 | |
| like opeartor - performance problem | Datenbanken | 15 | 08.12.2004 03:48 | |
| Smarty und PHP-Skript Problem | PHP Tipps 2004-2 | 2 | 03.12.2004 22:27 | |
| Problem mit alter JavaScript-Funktion | woods | PHP Tipps 2004 | 1 | 13.08.2004 13:34 |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| xebug performance tests, mermshaus \dr.e\ \by value\ |