php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 12-01-2009, 17:12
nohfreak
 Registrierter Benutzer
Links : Onlinestatus : nohfreak ist offline
Registriert seit: Nov 2007
Beiträge: 160
nohfreak ist zur Zeit noch ein unbeschriebenes Blatt
Standard OOP: Performance-Frage

Moin Leute,

die frage ist vermutlich trivial, und der Unterschied wird wenn überhaupt, dann nur marginal vorhanden sein, aber ich stelle sie trotzdem mal:

Ich habe ein Objekt, bei dem ich nicht immer alle Felder brauche, und diese demzufolge auch nicht immer alle mit Daten gefüllt sind.

Nun stellt sich mir die Frage, ob es nicht sinvoller wäre dem Objekt anstatt mehrerer Datenfelder mit:

PHP-Code:
private Feld1;
private 
Feld2;
private 
Feld3;
etc
Nur ein Datenfeld mit einem Assoziativen Array zu geben.

Ich denke mir dabei, dass ja durch das Instanzieren eines Objekts im Speicher durch das Deklarieren der Felder Platz reserviert wird für einen Verweis/Zeiger.

Wenn ich nun von 20 Feldern aber in manchen Fällen nur 5 Felder brauche, und somit die anderen garnichterst vollmache, dann wären die 15 Felder doch vergeudeter Speicher, oder sehe ich das falsch ?

Evtl. verbraucht das Handling eines Arrays ja noch mehr Speicher, oder erhöht merklich die Laufzeit,....

Ich weiß es nicht.

Ich hoffe ich konnte meine Frage so formulieren, dass ihr wisst, was ich eigentlich meinte.

Ist das generell Unsinn sowas, oder macht das doch irgendwie Sinn ?

Danke schonmal.

Gruß,
Nohfreak
Mit Zitat antworten
  #2 (permalink)  
Alt 12-01-2009, 17:35
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Interessante Frage. Ich habe das gerade mal - total simpel und nicht sehr aussagekräftig - ausprobiert und hatte als Ergebnis, das ein private Member mit einem Array von 50 Werten deutlich kleiner ist, wie eine Klasse mit 50 private Membern. Siehe dazu auch das Skript im Anhang. Danach ist eine Instanz der Klasse A 3208 Byte groß, eine Instanz der Klasse B nur 200 Byte. Probier einfach selbst ein wenig herum, um "echte" Ergebnisse zu bekommen.
Der Unterschied ist wirklich verblüffend. Doch ich denke, das ist hier keine Entscheidung des Speichers, nach der du deine Klassen aufbauen solltest, sondern eine Frage der Übersichtlichkeit und Wartbarkeit. Eine Instanz mit den Membern 'title', 'description' und 'link' ist definitiv leichter verständlich wie eine Instanz mit dem Member 'data'.
Vielleicht kann diesen Verbrauch jemand mit Kenntnissen des PHP-Sourcecodes etwas näher erläutern.
Angehängte Dateien
Dateityp: txt mem-class.txt (3,2 KB, 303x aufgerufen)
Mit Zitat antworten
  #3 (permalink)  
Alt 12-01-2009, 18:49
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Original geschrieben von PHP-Desaster
Interessante Frage. Ich habe das gerade mal - total simpel und nicht sehr aussagekräftig - ausprobiert und hatte als Ergebnis, das ein private Member mit einem Array von 50 Werten deutlich kleiner ist, wie eine Klasse mit 50 private Membern. ...
Könnte das daran liegen, dass die Eigenschaft "private" ja irgendwo gespeichert werden muss, und eine "private property" daher weniger Speicher belegt als 50?
Unter PHP4 gabs diese Eigenschaften noch nicht, möglicherweise war dort der Speicherverbrauch (annähernd) gleich.
Mit Zitat antworten
  #4 (permalink)  
Alt 12-01-2009, 18:51
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Zitat:
Wenn ich nun von 20 Feldern aber in manchen Fällen nur 5 Felder brauche, und somit die anderen garnichterst vollmache, dann wären die 15 Felder doch vergeudeter Speicher, oder sehe ich das falsch ?
Oha..
Das ist ein Indiz dafür, dass du versuchst ein God-Objekt zu schaffen.
http://de.wikipedia.org/wiki/God_object
__________________
Wir werden alle sterben
Mit Zitat antworten
  #5 (permalink)  
Alt 12-01-2009, 20:15
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Könnte das daran liegen, dass die Eigenschaft "private" ja irgendwo gespeichert werden muss, und eine "private property" daher weniger Speicher belegt als 50?
Kann mir das auch nur so erklären. Aber wie schon gesagt, wenn OOP, dann bitte auch richtig In der Verwendung der Klassenmember versuchen zu optimieren, indem diese durch Arrays ausgetauscht werden ist geradezu absurd. Da schießt du mit einem dusseligen SQL-Statement einen Haufen mehr Speicher ab.
Mit Zitat antworten
  #6 (permalink)  
Alt 12-01-2009, 20:23
nohfreak
 Registrierter Benutzer
Links : Onlinestatus : nohfreak ist offline
Registriert seit: Nov 2007
Beiträge: 160
nohfreak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Eigentlich bastel ich mir gerade eine Klasse zur User-Verwaltung.
Und da braucht man eben nicht auf jeder Seite alle Eigenschaften, die ein User theorethisch haben könnte.

Wäre dann ja Unsinn die immer z.B. im Konstruktor alle aus der DB zu holen und zu initialisieren, oder seh ich das falsch ?

Ich tippe darauf, dass die private Members mehr Speicher brauchen aus folgendem Grund:

Bei JAVA z.B. weiß ich, dass es so ist, dass eine Variable lediglich ein Verweis auf einen Ort im Speicher ist. Dementsprechend hätte jedes Member einen anderen Verweis und verschiedene Orte im Speicher.

Das Array hätte nur einen Verweis, der auf ein zusammenhängendes Stück Speicher ( "Speicherfläche" ) verweist,

Wenn das bei PHP auch so ist, dann könnte das evtl. des Rätsels Lösung sein.

Aber anscheinend ist das zu vernachlässigen, der Übersichtlichkeit halber ? Aber mit dem Array wärens immerhin 15x weniger Speicher. Das ist schon nicht ganz ohne bei großen Projekten würde ich vermuten, vorallem, wenn man begrenzte Ressourcen hat.
Mit Zitat antworten
  #7 (permalink)  
Alt 12-01-2009, 20:36
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von nohfreak
Aber mit dem Array wärens immerhin 15x weniger Speicher. Das ist schon nicht ganz ohne bei großen Projekten würde ich vermuten, vorallem, wenn man begrenzte Ressourcen hat.
Die ersparten Kosten gibst du dann allerdings für die Logik wieder aus, die herausfinden soll, was du brauchst und dann nur das lädt. Der Gewinn ist also alles andere als beträchtlich.
Mit Zitat antworten
  #8 (permalink)  
Alt 12-01-2009, 20:46
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Ach... du fummelst am falschen Ende rum ....

Teil dein Usermodell in 2 Stücke.
Usermodell UserProfilmodell
Fertig ist die Laube!

Es macht keinen Sinn das ganze Gedöns zu laden, obwohl man es doch nur sehr selten braucht. Wenn es wirklich geladen werden muß, dann eben nachladen.
Auch ist der Unterschied ob 5 Felder oder 15 noch in der Kategorie "wurscht"!
PHP hat normaler weise 8 bis 32 MB zur Verfühgung. Wieviele User passen da rein? Richtig: Massig!

Wenn du dir um solche Kleinigkeiten einen solchen Kopf machst, steht zu befürchten, dass woanders die fetten Bocke hängen.

Wie lädst du deine Klassen?
Alle direkt per include/require oder per SPLAutoload?

----------
PHP4 mit PHP5 vergleichen zu wollen, ist auch, naja, unglücklich:
PHP 4 ist gestorben und kommt auch nicht mehr wieder
Die ZendEngine ist komplett ausgetauscht worden
__________________
Wir werden alle sterben

Geändert von combie (12-01-2009 um 20:48 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 12-01-2009, 21:15
nohfreak
 Registrierter Benutzer
Links : Onlinestatus : nohfreak ist offline
Registriert seit: Nov 2007
Beiträge: 160
nohfreak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich lad die Klassen so:

PHP-Code:
function __autoload($class){
        require 
'lib/' $class '.class.php';
    } 
Aber momentan hab ich noch garkeine Probleme, ich hab mir nurso meine Gedanken gemacht.

Danke an alle, die geantwortet haben.
Mit Zitat antworten
  #10 (permalink)  
Alt 12-01-2009, 21:31
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Damit ist die Resourcenverplemperung schon mal eingegrenzt!

Aber, wie gesagt: Ich empfehle dir den SPL Autoloader.
Weil, von deinem darf es nur einen geben, SPL Autoloader viele!

Auch könntest du dich an das PEAR/Zend Benennungsschema halten. Dann wärst du mit einem großen Teil der modernen PHP Software Welt kompatibel. Muß ja kein Fehler sein...

Dein User Modell bekommst du bei google("Doctrine ORM") quasi geschenkt. Zumindest einen Seitenblick ist es wert.
__________________
Wir werden alle sterben

Geändert von combie (12-01-2009 um 21:33 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 13-01-2009, 15:42
nohfreak
 Registrierter Benutzer
Links : Onlinestatus : nohfreak ist offline
Registriert seit: Nov 2007
Beiträge: 160
nohfreak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ähm, also ich muss gestehen ich bin ziemlicher Anfänger, was OOP angeht, ich hab nach dem "SPL Autoloader" mal gegoogelt, aber das ist nicht wirklich was rumgekommen, das mir näher gebracht hat was das ist, und wie es funktioniert, für 1-2 erläuternde Sätze wäre ich sehr dankbar.

Den Codeschnippel da oben habe ich übrigens von Peter seinem OOP5 Tutorial, was ist dort denn schlecht dran, an der Benennung ?
Mit Zitat antworten
  #12 (permalink)  
Alt 13-01-2009, 15:59
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

OK:


Angenommen du hast einen Ordner "lib" wo du alle deine Klassen reinstopfst.

Eine Beispielklasse möge heißen: Combie_User

Dann lege einen Ordner in lib an: Combie
Also: ./lib/Combie
Darin eine Datei namens User.php
Mit dem Inhalt:
PHP-Code:
class Combie_User
{
  
// irgendein blödsinn

Der komplette Pfad der Datei lautet also: ./lib/Combie/User.php



In den Ordner lib werfen wir dann auch noch den SPL Autoloader LibAutoload.php:
PHP-Code:
class LibAutoload
{
  public static function 
autoload($name)
  {
    
$dirname  dirname(__FILE__);
    
$fileName str_replace('_',DIRECTORY_SEPARATOR,$name).'.php';
    
$file     $dirname.DIRECTORY_SEPARATOR.$fileName;
    if (
is_readable($file)) require_once $file;
  }

  public static function 
register()
  {
    
spl_autoload_register(array(__class__,'autoload'));
  }



Dein Hauptprogramm könnte dann so aussehen:
PHP-Code:
error_reporting(E_ALL E_STRICT);
ini_set('display_errors'TRUE);



require_once 
"./lib/LibAutoload.php"// autoloader laden
LibAutoload::register(); // einbinden



// frisch und frölich nutzen

$u = new Combie_User;
// tuwas mit u 
Dazu bitte lesen:
http://framework.zend.com/manual/de/...nventions.html Zend_Benennungsschema
http://pear.php.net/manual/de/standards.naming.php PEAR1_Benennungsschema
__________________
Wir werden alle sterben
Mit Zitat antworten
  #13 (permalink)  
Alt 13-01-2009, 16:51
nohfreak
 Registrierter Benutzer
Links : Onlinestatus : nohfreak ist offline
Registriert seit: Nov 2007
Beiträge: 160
nohfreak ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ah, okay, danke dir für die ausführliche Erklärung. Wenn ich das nun richtig verstehe, dann dient diese Namens-Konvention und der Loader nur der besseren Übersicht. Oder ?

Oder bringt dieses SPL auch Performance-Vorteile mit sich gegenüber meinem vorherigen Autoload ?
Mit Zitat antworten
  #14 (permalink)  
Alt 13-01-2009, 17:09
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Nein, es bringt keine Performance!
Die Übersicht, ist eine positive Nebenerscheinug.

Aber es ermöglicht dir die parallele Nutzung weiterer Autoloader wie sie z.B. im Zend Framework oder in Doctrine eingesetzt werden. Bei deinem Autoloader ist das nicht möglich. Da würde sich das Gedöns in die Quere kommen.... Du verhinderst/erschwerst damit die Integration deiner Scripte/Klassen in fremde Projekte. Und umgekehrt.
Willst du das?

Dein Weg ist also eine Insellösung, der über SPL entspricht einer (stillschweigenden) Übereinkunft der wichtigsten PHP5 Software Produzenten.

Tipp:
Wenn du noch die Wahl hast, dann schwenke um!



[Edit:]
@ Mr. Peter Kropff
Falls du das lesen solltest und es dir zusagt, dann nimm es doch bitte in dein Tutorial auf. So werden dann noch mehr OOP Anfänger auf den "rechten" Weg gebracht.
__________________
Wir werden alle sterben

Geändert von combie (13-01-2009 um 17:21 Uhr)
Mit Zitat antworten
  #15 (permalink)  
Alt 19-01-2009, 23:48
ezkimo
 Registrierter Benutzer
Links : Onlinestatus : ezkimo ist offline
Registriert seit: Apr 2005
Ort: Beckum / Westf.
Beiträge: 279
ezkimo befindet sich auf einem aufstrebenden Ast
ezkimo eine Nachricht über ICQ schicken
Standard

Okay das mit der SPL Autoload Funktion ist ziemlich genial. Der Vorteil liegt natürlich für OOP auf der Hand und ich konnte diesen wertvollen Tipp bereits umsetzen. Danke an dieser Stelle schon mal.

Leider habe ich ein Problem. Ich programmiere gerade ein Plugin für eine Software, die bereits eine __autoload() Funktion besitzt. Die Funktion spl_autoload_register() scheint die bestehende __autoload() Funktion der Software zu übrschreiben. Das Manual sagt dazu folgendes:
Zitat:
If your code has an existing __autoload function then this function must be explicitly registered on the __autoload stack. This is because spl_autoload_register() will effectively replace the engine cache for the __autoload function by either spl_autoload() or spl_autoload_call().
Soweit alles schlüssig. Wie registriere ich nun spl_autoload_register() im __autoload Stack? *grübel*
__________________
MM Newmedia | MeinBlog
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:05 Uhr.