php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 05.03.2011, 03:45  
Neuer Benutzer
 
Registriert seit: 05.03.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
laszlokorte befindet sich auf einem aufstrebenden Ast
Standard Performance Problem

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).
laszlokorte ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 05.03.2011, 08:39  
Erfahrener Benutzer
 
Registriert seit: 10.01.2010
Beiträge: 386
PHP-Kenntnisse:
Fortgeschritten
ChrisvA befindet sich auf einem aufstrebenden Ast
Standard

Zu deiner Frage mit den Objekten:
Ich weiß zwar nicht genau, wie PHP mit Objekten genau umgeht, könnte mir aber vorstellen, dass sie bei deinem Aufbau mindestens einmal kopiert werden und damit Zeit verschlingen.
Versuch doch mal das erstellen des Objektes in die Funktion testmerunner() zu integrieren, möglicherweise entfällt dann das Erstellen einer Kopie des Objekts und du sparst ein wenig Zeit.
ChrisvA ist offline   Mit Zitat antworten
Alt 05.03.2011, 13:07  
Neuer Benutzer
 
Registriert seit: 05.03.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
laszlokorte befindet sich auf einem aufstrebenden Ast
Standard

Kopiert werden sollte das Objekt ja eigentlich nicht, da es ja zumindest seit php 5.x? per Referenz übergeben sollte. Dass ein Objekt nach der Instanzierung noch durch ein paar Methoden durchgegeben wird bis es letztendlich irgendwann in eine variable oder property zugewiesen wird, ist ja auch ein total realistischen Szenario.

Natürlich hilft das nicht viel wenn ich von meiner Library-Struktur erzähle ohne Code zu posten, aber was mich halt wundert ist, wie andere Frameworks performant laufen, denn wenn ich mir deren Struktur anschaue (Doctrine, Zend, Symfony, Propel), dann sehe ich 1000 *_Factory-Klassen, *_Builder-Klassen, *_Register-Klassen, *_Runner-Klassen, DP_Injection-Klassen, Config-Reader, teilweise noch komplexe Event-Handler-System und so weiter. Das mag ja auch alles Sinnvoll für die Struktur und den DRY-Grad sein, doch die Performance meiner Anwendung soll jetzt daran scheitern, dass ich Objekte nach der instanzierung noch durch mehrere Methoden herumreiche?
laszlokorte ist offline   Mit Zitat antworten
Alt 06.03.2011, 16:40  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
Kopiert werden sollte das Objekt ja eigentlich nicht, da es ja zumindest seit php 5.x? per Referenz übergeben sollte.
Das ist nicht immer so. Beispielsweise kopiert foreach deine Objekte und du greifst nicht auf die Referenzen zu. Ich würde daher an deiner Stelle - wie Chriz das schon sagt - deinen Code daraufhin nochmals prüfen.

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!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 06.03.2011, 18:01  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Was ist denn (unter PHP5) eine Kopie eines Objekts? Ein Klon?

Zitat:
As of PHP5, an object variable doesn't contain the object itself as value anymore. It only contains an object identifier which allows object accessors to find the actual object. When an object is sent by argument, returned or assigned to another variable, the different variables are not aliases: they hold a copy of the identifier, which points to the same object.
- http://php.net/manual/en/language.oop5.references.php

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.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 06.03.2011, 22:03  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
Das ist nicht immer so. Beispielsweise kopiert foreach deine Objekte und du greifst nicht auf die Referenzen zu.
Jetzt habe ich gerade einen Schreck bekommen.
PHP-Code:
$Objects = array();

$Object = new stdClass();
$Object->Attribute 'test';

$Objects[0] = $Object;

foreach(
$Objects as $Object)
{
    
$Object->Attribute 'foreach';
}

var_dump($Object);

// object(stdClass)#1 (1) { ["Attribute"]=> string(7) "foreach" } 
Die Referenz innerhalb von foreachzeigt also immer noch auf dasselbe Objekt.
hts ist offline   Mit Zitat antworten
Alt 06.03.2011, 22:10  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Ich habe innerhalb von Baum-Strukturen die Erfahrung gemacht, dass ein

PHP-Code:
public function getFoo() {
   foreach (
$this->children as $child) {
      if (
$child->getFoo() == 'bar') {
         return 
$child;
      }
   }

nicht die Referenz zurück gibt, sondern eine Kopie, sofern ich ausserhalb der Methode weiter arbeite (z.B. Manipulation der Inhalte). Das geht nur, wenn ich ein

PHP-Code:
public function &getFoo() {
   foreach (
$this->children as $id => $DUMMY) {
      if (
$this->children[$id]->getFoo() == 'bar') {
         return 
$this->children[$id];
      }
   }

im Code schreibe. Aus diesem Grund nutzt das APF für die Baum-Strukturen letztere Notation.
__________________
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!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 07.03.2011, 10:46  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

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.
fab ist offline   Mit Zitat antworten
Alt 07.03.2011, 14:51  
Neuer Benutzer
 
Registriert seit: 05.03.2011
Beiträge: 16
PHP-Kenntnisse:
Fortgeschritten
laszlokorte befindet sich auf einem aufstrebenden Ast
Standard

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).
laszlokorte ist offline   Mit Zitat antworten
Alt 07.03.2011, 16:02  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Die Aussagen hier sind auch ausschließlich zu PHP5(.3).

Zitat:
Zitat von laszlokorte
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.
Möglicherweise wird es bei Objekten nicht genutzt.

Zitat:
Was passiert, wenn testme() einen dynmischen String zurück gibt, habe ich noch nicht probiert.
Allerdings habe ich gerade ein wenig rumprobiert. Mir ist es nicht gelungen, eine Funktion, die einen konstanten String zurückgibt, zu definieren, die den Speicher in irgendeiner Form zu teilen scheint. Das muss nichts heißen, ist aber natürlich ein Indiz gegen die Theorie.

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.
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (07.03.2011 um 16:30 Uhr).
mermshaus ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ä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\

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:27 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum