Mailinglisten-Archive |
Hallo Thomas, danke schon mal. Ich glaube, ich kann den Verursacher eingrenzen (nach nur über einer Woche :/). Die Klassen, um die es sich hier handelt, lassen sich nicht durch einzelne Instanzen darstellen. Es ist halt wie das Obstbeispiel mit Birne, Apfel und so. Bei einer "Apfel"-Klasse ist das Verhalten konstant. Ich suche jetzt die "Birnen"-Klasse, die sich hochschaukelt. Bei 12000+ Obstteilen mit einer Zeit am Anfang von 0.7ms und beim letzten von 300ms, ist es schon spürbar auch für den Arbeitgeber :D Naja und ich werde soweit wie sinnvoll ab jetzt brav unsets einbauen ;) Beste Grüße Michael Fuhrmann -----Ursprüngliche Nachricht----- Von: php [mailto:php-bounces at lists.phpbar.de] Im Auftrag von Thomas Koudela Gesendet: Montag, 12. August 2013 12:17 An: deutschsprachige PHP-Mailingliste Betreff: Re: [php] Zeitproblem beim Methodenaufruf Hallo Michael. In Deinem Programm passiert folgendes: Bei jedem Schleifendurchlauf wird eine neue Instanz Deiner Klasse erzeugt. Zwar weiß der Garbage-Collector, dass Du $inst überschreibst, und damit dass er die alte Instanz löschen kann, jedoch wird er nicht automatisch bei jeder Variablenzuweisung ausgelöst. Deshalb benötigst Du das unset()! (Ich finde dies ein schönes Beispiel was guten Code von lediglich funktionierendem unterscheidet. Leider bekommen Kunden/Arbeitsgeber davon in der Regel nichts mit. Aber zurück zum Problem.) Da weder der Garbage-Collector aktiviert wird, noch der Speicher direkt freigegeben wird, schreibst Du dir erst den 1st-Level Cache, dann den 2nd-Level Cache, dann den 3nd-Level Cache (falls vorhanden), dann den Arbeitsspeicher und zum Schluss die SWAP-Partition der Festplatte voll. Diese Speicher sind nicht nur sukzessive langsamer, sondern bei der Auslagerung geht zusätzlich Zeit verloren. Die Ergebnisse deiner Zeitmessung sind daher nicht verwunderlich. Überhaupt würde ich an Deiner Stelle prüfen, ob ich nicht mit einer Instanz auskomme, die ich eventuell mit einer extra Methode nur neu initialisiere, denn das Löschen und Erzeugen einer ganzen Instanz kostet in der Regel mehr Zeit als die Neubelegung einiger Instanz-Variablen. Gruß, Thomas Zitat von Michael Fuhrmann <technik at piaunddirk.de>: > Hallo, > > > > ich habe folgendes Problem. Mein Code hat ungefähr diese Struktur: > > > > <?php > > class testp extends ... // mehr Elternklassen > > { > > function __construct() > > { > > } > > } > > class test extends testp > > { > > function __construct() > > { > > parent::__construct(); > > } > > > > public function testmethod($name) > > { > > > > } > > } > > > > for ($i = 0; $i < 3000; $i++) > > { > > $inst = new test(); > > $name = 'lala'; > > $inst->testmethod($name); > > // hier würde ich unset($inst); schreiben > > } > > ?> > > > > In diesem Test ist die Laufzeit für jeden Durchlauf konstant. Doch in > dem Real-Life Code muss ich erstens bei jedem Loop ein unset($inst) > einfügen und der alleinige Aufruf der Methode, die nichts tut, frist > bei jedem Durchlauf immer mehr Zeit. Anfänglich sind es „nur“ 0.7ms. > Beim 3000. sind es schon 14 und mehr. > > > > Ich habe das Problem bereits auf stackoverflow gepostet mit originalem > Code und Laufzeiten: > > > <http://stackoverflow.com/questions/18162165/why-does-a-method-call-sl > ows-do > wn-everything> > http://stackoverflow.com/questions/18162165/why-does-a-method-call-slo > ws-dow > n-everything > > > > Allerdings konnte mir dort keiner einen Hinweis auf das zugrunde > liegende mögliche Problem liefern. Allein dass ich ein unset benutzen > muss, macht mich schon stutzig. Ich verstehe es einfach nicht. > > > > > > Beste Grüße > > Michael Fuhrmann > > -- > ** Allgemeine deutschsprachige PHP-Liste: php at lists.phpbar.de ** > Informationen: http://www.phpbar.de > http://lists.phpbar.de/cgi-bin/mailman/listinfo/php -- Thomas Koudela Programmierdienstleistungen von A bis Web Mozartstraße 6 D-45529 Hattingen Tel: +49 (0)2324-392320 Email: service at koudela.net Internet: http://www.koudela.net -- ** Allgemeine deutschsprachige PHP-Liste: php at lists.phpbar.de ** Informationen: http://www.phpbar.de http://lists.phpbar.de/cgi-bin/mailman/listinfo/php
php::bar PHP Wiki - Listenarchive