phpbar.de logo

Mailinglisten-Archive

[php] Zeitproblem beim Methodenaufruf

[php] Zeitproblem beim Methodenaufruf

Thomas Koudela thomas at koudela.net
Mo Aug 12 12:16:51 CEST 2013


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



Mehr Informationen über die Mailingliste php

php::bar PHP Wiki   -   Listenarchive