![]() |
| | Themen-Optionen |
| | Nach oben #21 |
| Erfahrener Benutzer Registriert seit: 18.08.2005
Beiträge: 108
|
Zu share-nothing: Bei der Parallelisierung, die nunmal nötig ist, um eine Applikation auf mehrere Server oder so zu verteilen, hat man immer das Problem der Komunikation zwischen den Threads. Aus der Java-Welt kennt man hier die komplizierten Alleskönner-Architekturen, die durchaus skalieren, aber nur begrenzt, weil es irgendeinen Knotenpunkt gibt, durch den alles durchmuss. Bei klassischen PHP-Architekturen wird nichts geteilt, jedes abgearbeite HTTP-Request ist unabhängig. Eigener Apache-Prozess, eigene Session, keine Kommunikation mit den anderen. Keine Zugriffe auf fremde Sessions. Das skaliert endlos in die Breite. Stell zehnmal soviele Server hin und es ist zehnmal so schnell. http://www.sitepoint.com/blogs/2004/...oesnt-get-php/ Von Singletons halte ich im Allgemeinen eher wenig. Sind schliesslich nichts weiter als globale Variablen, die sich ein OOP-Kleidchen angezogen haben. Singletons kann man als Abkürzung verwenden, wenn man zu faul ist, Kontexte explizit durchzureichen. Das kann sogar sinnvoll sein, wenn man spezialisierte Architekturen schreibt, die einen Kontext annehmen (z.B. das PHP-Typische "ich bin vom Browser aufgerufen worden und in $_REQUEST stehen meine Daten"), da dass explizite durchreichen von Kontexten durchaus lästig sein kann. Mit wiederverwendbarem OOP hat das allerdings nichts zu tun. Es gibt keine Objekte, die es nur einmal geben darf. Sowas basiert immer auf einer Annahme, von der nicht zu garantieren ist, dass sie überall gilt, und man vergisst dabei gerne gegen Interfaces statt gegen Implementationen zu programmieren. Klassisches Beispiel ist der PC-Speaker (das Piep-Ding Klingt einleuchtend, ist aber Unsinn. Niemand (ausser dem Betriebssystem usw.) sollte einfach annehmen, dass es einen PC-Speaker gibt. Man sollte annehmen, dass man ein Soundausgabegerät braucht, ein solches als Parameter akzeptieren und darauf den Sound ausgeben. Ob der Sound auf den PC-Speaker geht, auf eine der potentiell mehreren Soundkarten oder obs quer durchs Internet geschickt wird an den Kerl der lieber von Zuhause arbeiten möchte, hat mich an der Stelle nicht zu interessieren. |
| | |
| | Nach oben #22 | ||
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Aber die Alternative ist doch ein böses Durcheinander, in dem du selbst aus dem Template (schreibend) auf die Datenbank zugreifen kannst etc. Und wenn ich mich recht erinnere, waren diese Zeiten noch ätzender! Klar, alles geht schön flott on der Hand, aber testen? Und mögliche Fehlerquellen verstreuen sich über die komplette Anwendung. Sind natürlich extreme, aber die Frage ist ja immer auch, warum man nicht weiß, welche Komponente welche Zugriffe braucht. Ich glaube, in diese Fragen (wer weiß und darf was) zu investieren bringt einen zu den Kernpunkten einer Anwendung. Und wenn man diese sauber geöst bekommt, dann passts (bis zu den nächsten Fragen... *g) und dann braucht man keine Globals und Singletons. Zitat:
In der Kritik ist ja nicht, dass man verhindert, dass ein Objekt nochmal gebaut wird, sondern, dass man von überall drauf zugreifen kann. (Bezeihungsweise: Bei "Waq" ist das doch in der "Kritik" - aber es gibt natürlich Konstrukte, die sich nur sehr aufwändig - sei es in der Implementerung oder in der Last zur Laufzeit - realisieren lassen, wenn man nicht ausschließt, dass es maximal eine Instanz von dieser Klasse zur Laufzeit gibt.). Basti Geändert von Basti (20.12.2006 um 21:56 Uhr). | ||
| | |
| | Nach oben #23 |
| Benutzer Registriert seit: 24.10.2006
Beiträge: 90
|
@Ben Ich habe keine Benchmarks durchgeführt, aber rein theoretisch ist ein Singleton langsamer, als wenn du Objekte durchreichst. Bei einem Singleton rufst du jedesmal eine Funktion auf und das ist wesentlich langsamer als wenn du einfach auf eine Variable zugreifst. Teste das z.B. mal mit PHP_VERSION und phpversion () aus. Du wirst sehen, dass PHP_VERSION schneller ist. Ich verwende bei kleineren Sachen (und ich habe hauptsächlich kleine Sachen mit vlt. 200 Besucher pro Tag) aber trotzdem Singletons. Allerdings sollte man sich beim Thema Performance zuerst um andere Sachen kümmern (Apache, Dateisystem, Datenbank, Caching mit 404 ...) MfG Byrel [EDIT by Ben] Diskussion über die Caching-Methode über den HTTP-Code 404: http://forum.developers-guide.net/showthread.php?t=4911 Geändert von Ben (23.12.2006 um 20:07 Uhr). |
| | |
| | Nach oben #24 | |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Also das Zend Framework verwendet ja eine Registry, um Singleton-Objekte zu verwalten. Zitat:
Hm, ich will jetzt nicht sagen "wenn die das machen, dann wird das schon okay sein", aber wenn es wirklich signifikant langsamer wäre, dann würde das in solch einem Framework doch sicherlich auch anders geregelt werden, oder? Ich muss jetzt auch nicht jede 10000stel Sekunde rauskitzeln .. mir ging es mehr um signifikante Unterschiede. @bzgl: http_load .. hab ich noch nicht ausprobiert! | |
| | |
| | Nach oben #25 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Ich verstehe jetzt nicht so genau den Vorteil der ZF-Variante. Es ist doch egal ob ich eine statische Methode aufrufe oder das über die Registry des ZF mache. Ich denke zweiteres ist sogar noch langsamer oder?
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #26 |
| Benjamin Steininger Registriert seit: 02.06.2005 Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
| aber vieleicht hat man so bissel mehr "system" dadrin unter anderem, weil man eine klasse nicht als singleton programmieren muss sondern so einfach zugriff auf EINE Instanz der klasse hat.
|
| | |
| | Nach oben #27 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Ist doch Sinn des Singletons nur eine Instanz zu haben! Wenn ich die Instanz der Configuration einheitlich $Configuration nenne, dann ist das doch kein Problem. Genauso einfach gehts auch mit $registry->get('Configuration') (bin mir mit dem call jetzt unsicher). Aber letzten Endes ist das die Implementation von schon vorhandener Funktionalität.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #28 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Im Zend Framework existiert genau eine Instanz der Registry. Es können aber jederzeit weitere Zend_Config-Instanzen erstellt werden. Die Registry bietet ja nur den globalen Zugriff auf die Instanzen ... Keine Ahnung, wo da Vor- und Nachteile liegen. Habe hier zwar viel gelesen und auch Einiges verstanden, aber so wirklich durchblicken tue ich immer noch nicht. Aber das kommt ... |
| | |
| | Nach oben #29 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Registry und Singleton sind zwei unterschiedliche Patterns. Gemeinsam haben sie, dass sie Objekten einen Zugang zu anderen Objekten (bzw. sich selbst im Falle von Singletons) anbieten, die sonst keinen Zugang hätten, da ihnen nichts übergeben wurde, dass ihnen diesen Zugang geben kann. Hier allerdings ist das Singleton absolut global und die Registry ist nur den Objekten verfügbar, denen sie auch übergeben wurde (falls sie nicht selbst als Singleton oder statische Klasse implementiert ist). Der wichtige Unterschied aber ist, dass es von einer Singleton-Klasse nur eine Instanz geben kann, eine Registry kann aber Instanzen von Klassen aufnehmen, die noch weitere Instanzen im Umlauf haben. Ich habe auch die Reistry aus meinem Framework/CMS rausgeschmissen, macht manches aber nicht einfacher bzw. ich hab noch nicht überall einen passenden Ersatz gefunden. Basti |
| | |
| | Nach oben #30 | |
| Benutzer Registriert seit: 24.10.2006
Beiträge: 90
| Zitat:
MfG Byrel | |
| | |
| | Nach oben #31 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Zunächst einmal gibt es imho die "perfekte Performance" nicht und außerdem geht es ja eher um einen Kompromiss. Die Frage ist einfach, auf welche Engpässe man aufpassen muss, im konkreten Fall eben, ob Singletons solch einen Engpass darstellen könn(t)en. Ich habe den Thread ja nicht in Zusammenhang mit der Nutzung des ZF erstellt. Und nein, ich will hier jetzt nicht hören, dass man dann besser eine eigenständige Sache baut und nicht auf ein fertiges Framework zurückgreift. Ich will es einfach nicht hören .. Stichwort: Kompromiss zwischen Arbeitsaufwand und Ertrag! In diesem Sinne. Grüße, Ben. |
| | |
| | Nach oben #32 | |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Hier noch ein kleiner Nachtrag: http://paul-m-jones.com/blog/?p=238#comment-99590 Zitat:
| |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| PEAR-Benchmark nutzen um Performance einer Template-Engine zu messen | Ben | PEAR, PECL und Frameworks | 9 | 26.02.2007 22:16 |
| getimagesize und Performance ? | CIX88 | PHP-Programmierung | 6 | 04.05.2006 08:28 |
| [FRAGE] performance von phptags | J33d3X | PHP-Programmierung | 14 | 30.01.2006 14:52 |
| Performance erhöhen | Steve231 | Datenbanken | 5 | 18.10.2005 16:39 |