2010-07-25 12 views
5

Ich habe ein maßgeschneidertes MVC PHP-Framework, das ich gerade umschreibe und hatte eine Frage zu Leistung und magischen Methoden. Mit dem Model-Teil des Frameworks dachte ich, ob magische Methoden zu viel Leistung bringen würden, wenn sie sich lohnen würden. Ich meine, der Zugriff auf (Lese- und Schreib-) Modelldaten wird eines der am häufigsten ausgeführten Dinge sein. Ist die Verwendung von __get/__set magischen Methoden zu groß für eine Performance-Hit für starke Nutzung Funktionalität wie der Modell Teil eines MVC-Framework?__get/__ set/__ Call-Performance-Fragen mit PHP

+0

Sie sollten versuchen, einen anderen Weg zu finden, sie zu benutzen, und sie nur verwenden, wenn es notwendig ist. Abgesehen davon, dass sie langsam sind, sind sie meiner Meinung nach auch schwieriger zu lesen und zu warten. –

Antwort

8

Messen Sie es.

Es hat sicherlich einen großen Leistungseinbruch, vor allem wenn man bedenkt, dass Funktionsaufrufe in PHP teuer sind. Dieser Unterschied wird in der nächsten Version von PHP, die Optimierungen implementiert, die den regulären Zugriff auf deklarierte Instanzeigenschaften deutlich beschleunigen, noch größer.

Das heißt, PHP ist selten der Flaschenhals. E/A- und Datenbankabfragen benötigen häufig viel mehr Zeit. Dies hängt jedoch von Ihrer Verwendung ab; der einzige Weg, um sicher zu sein, es zu benchmarken.

Das sind auch andere Lesbarkeitsprobleme mit den magischen Methoden. Sie degenerieren häufig in eine große switch Anweisung und kompromittieren Code-Vervollständigung, die beide Treffer in der Programmierproduktivität sein können.

+3

Einige IDEs erlauben Code-Vervollständigung für magische Methoden, wenn Sie [die Klasse mit @method kommentieren] (http://manual.phpdoc.org/HTMLframesConverter/default/phpDocumentor/tutorial_tags.method.pkg.html) – Gordon

+0

Es gibt einige [gut auf PHP-Interna auf YouTube schauen] (http://www.youtube.com/watch?v=p5S1K60mhQU). – alex

3

Rein aus meiner Erfahrung, fügt es eine ganze Menge Overhead hinzu. Auf einer Seite mit ungefähr 4000 __get 's (ja, es gab ziemlich viele Daten auf dieser Seite) war die Leistung ziemlich messbar langsamer, bis zu dem Punkt, als es inakzeptabel wurde. Ich habe alle __set 's & __get' s für Variablen, die keine anderen Daten geändert werden müssen oder externe Abhängigkeiten (wie Fremdschlüssel) überprüft werden, warf nach dem die Zeit, um diese Seite zu generieren war etwa 15% der Zeit Es hat vorher gedauert.

0

Ich habe mich gerade die gleiche Frage gestellt und kam zu der gleichen Schlussfolgerung: Es ist besser, die Eigenschaften auf die traditionelle Weise einzustellen. __get() + massiver Schalter verlangsamt alles

7

Hier ist ein (drei Jahre alt) mit einigen Benchmarks. Führen Sie Ihre eigenen Tests aus, um zu sehen, wie sich dies auf Ihren Code auswirkt.

Im Allgemeinen sind sie viel langsamer. Aber sind sie der Flaschenhals? Es hängt davon ab, was du tust. Wenn es um Geschwindigkeit geht, wo hört es auf? Die foreach-Schleife ist langsamer als die for-Schleife, aber die meisten Leute schreiben nicht ihren gesamten Code neu, um die for zu verwenden.

Wenn Sie nur PHP verwenden, ist die Geschwindigkeit Ihres Codes nicht so kritisch. Persönlich würde ich bevorzugen, welcher Stil es einfacher macht zu programmieren.