phpbar.de logo

Mailinglisten-Archive

[php] Zeitproblem beim Methodenaufruf

[php] Zeitproblem beim Methodenaufruf

Michael Fuhrmann technik at piaunddirk.de
Mo Aug 12 12:42:33 CEST 2013


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



Mehr Informationen über die Mailingliste php

php::bar PHP Wiki   -   Listenarchive