Beeinträchtigen Getter und Setter die Performance in C ++ / D / Java?
Dies ist ein ziemlich altes Thema: Sind setter und Getter gut oder böse?
Meine Frage hier ist: Compiler
C++ /D /Java
inline die Getter und setter?
In welchem Umfang machen die Getter/setter auf die Leistung auswirken (function call stack frame) im Vergleich zu einer direkten feldzugriff. Neben all den anderen Gründen für die Verwendung von Ihnen, ich würde gerne wissen, ob Sie sollen sich auf die Leistung abgesehen davon, dass ein guter OOP-Praxis.
InformationsquelleAutor der Frage alvatar | 2009-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kommt es an. Es gibt keine Universelle Antwort, die immer gehen, um wahr zu sein.
In Java, der JIT-compiler wird wahrscheinlich inline-es früher oder später. Soweit ich weiß, werden die JVM-JIT-compiler nur stark optimiert code verwendet, damit Sie sehen können, die function-call overhead zunächst, bis die getter/setter aufgerufen wurde ausreichend oft.
In C++, wird es mit ziemlicher Sicherheit eingebettet (vorausgesetzt, Optimierungen aktiviert sind). Es gibt jedoch einen Fall, wo es nicht wahrscheinlich ist:
Wenn die definition der Funktion nicht sichtbar für Benutzer der Klasse (die auch foo.h, aber nicht sehen foo.cpp), dann wird der compiler möglicherweise nicht in der Lage sein, um die inline-Funktion aufrufen.
MSVC sollte in der Lage sein, um inline-es wird ein link-time code-Generierung aktiviert ist, da eine Optimierung. Ich weiß nicht, wie GCC behandelt das Thema.
Durch die Erweiterung, das bedeutet auch, dass, wenn die get-Methode ist definiert in einer anderen .dll/.so, der Anruf kann nicht inlined.
In jedem Fall, ich glaube nicht, dass triviale get - /Set-Methoden sind notwendig "gute OOP-Praxis" ist, oder dass es "alle anderen Gründe für die Verwendung von Ihnen". Eine Menge Leute denken, trivial get - /Set-Methoden zu 1) ein Zeichen von schlechtem design, und 2) eine Verschwendung von Eingabe.
Persönlich, es ist nicht etwas, das ich aufgeregt oder so. Um mich für etwas zu qualifizieren, als "gute OOP-Praxis", es muss eine quantifizierbare positive Effekte. Triviale get - /Set-Methoden haben einige geringfügige Vorteile, und einige nur als unbedeutende Nachteile. Als solche, ich glaube nicht, dass Sie eine gute oder schlechte Praxis ist. Sie sind nur etwas, das Sie tun können, wenn Sie es wirklich wollen.
InformationsquelleAutor der Antwort jalf
In D, alle Methoden von Klassen, nicht aber die Strukturen sind standardmäßig virtuell. Sie können eine Methode nicht-virtuellen, indem Sie entweder die Methode oder der ganzen Klasse Finale. Auch D hat die Eigenschaft syntax, die es Ihnen ermöglicht, etwas zu machen, einen öffentlichen Bereich, und dann ändern Sie es auf eine getter - /setter-später ohne zu brechen source-level-Kompatibilität. Also in D würde ich nur empfehlen mit den öffentlichen Bereichen, es sei denn, Sie haben einen guten Grund es anders zu machen. Wenn Sie verwenden möchten triviale Getter/setter für einige Grund, wie Sie nur eine get-Methode und die variable Lesen-nur von außerhalb der Klasse, machen Sie endgültig.
Edit: Zum Beispiel die Linien:
wird die Arbeit für beide
und
InformationsquelleAutor der Antwort dsimcha
Habe ich versucht, in Java: das gleiche mit und ohne getter und setter. Das Ergebnis: es gibt keinen signifikanten Unterschied zwischen den Bearbeitungszeiten der beiden Versionen. Hier' s den code:
Ich weiß, am Ende Bob ist ein bisschen älter als ich, aber dafür, sollte es okay sein.
InformationsquelleAutor der Antwort Arpad Kosa
Ich hatte genau die gleiche Frage einmal.
Um es genau richtig, den ich programmiert habe zwei kleine Programme:
Ersten:
Zweiten:
Den ich kompiliert habe, Sie zu assembler, mit -O3 (vollständig optimiert)
und im Vergleich der beiden Dateien. Sie waren identisch.
Ohne Optimierung waren Sie unterschiedlich.
Dies war unter g++.
Also, genau richtig deine Frage: Compiler leicht optimieren Getter und setter.
InformationsquelleAutor der Antwort Marenz
Jede JVM (oder compiler) Wert sein Salz muss inlining. In C++ der compiler inlines die Getter und setter. In Java, der JVM-inlines Sie zur Laufzeit, nachdem Sie aufgerufen wurden, die "genug" - Zeiten. Ich weiß nicht, über D.
InformationsquelleAutor der Antwort notnoop
Abhängig von der erwarteten Entwicklung Ihrer Klasse, get - /Set-Methoden unübersichtlich dein code oder geben Ihnen die Flexibilität zu erweitern, Ihre Durchführung, ohne den client-code.
Oft stoße ich auf Klassen, die als "Daten-Container", die sowohl getter und setter für jedes Mitglied. Das ist Unsinn. Wenn Sie nicht erwarten zu müssen, um einige 'spezielle' Funktionen werden ausgelöst, wenn die erste oder die Einstellung ein Mitglied zu werden, schreiben Sie nicht.
Angesichts der Geschwindigkeit der Maschine, die Mühe des Schreibens der zusätzlichen Abstraktion, die Kosten dem Kunden mehr Geld.
Meisten Compiler kann optimieren triviale Getter/setter, aber sobald Sie deklarieren einen virtuellen (in C++), zahlen Sie eine zusätzliche lookup - oft lohnt sich der Aufwand.
InformationsquelleAutor der Antwort
Einen getter erforderlich wäre für bestimmte Mitglieder, in einigen Fällen. Allerdings bietet eine getter-und setter für die einzelnen Daten-member einer Klasse ist nicht eine gute Praxis. Tun, das wäre kompliziert werden die Klasse die Schnittstelle. Auch setter bringen würde, in der Ressourcen-Eigentum von Problemen, wenn nicht richtig behandelt.
InformationsquelleAutor der Antwort Modicom
Zitat aus hier Bezüglich der D-Programmierung Langiage
InformationsquelleAutor der Antwort
In C++, wenn ein compiler die Optimierungen aktiviert sind, dann Getter und setter kann auch 'inline': d.h., umgesetzt werden, mit der gleichen Maschine Anweisungen, wie es sein würde, für den direkten Zugriff auf die zugrunde liegenden Daten der Mitglieder.
InformationsquelleAutor der Antwort ChrisW
Werde ich echo Xtofl.
Getter und setter sind eines jener Dinge, die sind manchmal nützlich, aber Sie bekommen diese doktrinär Menschen, die irgendwie den Sprung von "hat sich bewährt in einigen Fällen" zu "verwendet werden muss, die ganze Zeit und wenn Sie don ' T es du bist ein Ketzer, die getötet werden sollten".
Wenn Sie Nebenwirkungen haben, um einen get-oder set, mit allen Mitteln verwenden Sie eine get-oder Set -.
Aber wenn nicht, schreiben der Getter und setter nur unübersichtlich bis der code. Es gibt einen kleinen performance-Einbußen. In Java, wenn es nur ausgeführt ein paar mal, die perforance Strafe sollte keine Rolle spielen, und wenn es ist Häufig ausgeführt wird, sollte es werden eingebettet, so dass die Strafe abgemildert wird. Also ich würde keine sorgen mehr zu machen den code schwerer zu Lesen.
Sind und nicht für eine minute zu kaufen, das argument, dass diese beseitigt das problem der globalen Daten. Globale Daten ist schlecht und sollte vermieden werden. Aber deklarieren Mitglied Bereich privat-und dann die Erstellung der öffentlichen Getter und setter für die nichts tut, um das problem zu lösen.
InformationsquelleAutor der Antwort Jay