Mailinglisten-Archive |
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-slows-do
> wn-everything>
> http://stackoverflow.com/questions/18162165/why-does-a-method-call-slows-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
php::bar PHP Wiki - Listenarchive