Warum ist Reflexion so langsam?
Ist es, denn wir sollten Belastungsklasse (von string
zum Beispiel), erstellen Sie eine Instanz, dann Suche nach geeigneten Methode, pack-Parameter, und dann einfach die Methode aufrufen? Also die meiste Zeit damit verbracht wird, auf diese Operationen, statt der expliziten Methodenaufruf auf einem Objekt, richtig?
- In der modernen jdk/jvm-Implementierung es ist nicht so langsam wie du denkst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jedem Schritt, den Sie nehmen muss validiert werden jedes mal, wenn Sie nehmen Sie es, wenn Sie mithilfe von reflektion. Zum Beispiel, wenn eine Methode aufgerufen wird, muss es prüfen, ob das Ziel tatsächlich eine Instanz der Alleinspieler von der Methode, ob Sie haben die richtige Anzahl von Argumenten, ob jedes argument ist die richtige Art, etc.
Es gibt absolut keine Möglichkeit, inlining oder andere performance-tricks.
Wenn Sie finden, Typen oder Methoden-Namen, das ist am besten gehen mit einer einfachen map-lookup -, die durchgeführt werden, jedes mal, wenn Sie es ausführen, anstatt einmal bei der JIT-Zeit.
Grundsätzlich gibt es eine Menge mehr zu tun. Aber Reflexion ist um einiges schneller geworden, als es früher zu sein... wenn Sie finden es viel zu langsam, Sie kann gut sein, übernutzung es.
Als Nachtrag zu Jon Skeet ist oben (ich brauche mehr ansehen, um einen Kommentar abgeben zu können.):
Reflexion ist abhängig von CPU-Ressourcen zur Verfügung stehen; wenn Sie problem mit Ihrer Anwendung zu langsam, Reflexion lösen nicht alles, nur machen es langsamer.
Wie Java selbst, Reflexion nicht langsam mehr - es ist mehr ein altes Gerücht 😉
Wenn Sie eine Methode aufrufen, müssen Sie wissen, wenn Sie so tun, mit gültigen Argumenten, die auf ein gültiges Objekt, was der return-Typ ist, und was-bytecode ausführen. Wenn die genaue Methode ist im angegebenen code können Sie java schnell herauszufinden Sachen aus und bewegen sich zur Ausführung der Methode.
Wenn Sie dies tun mit Reflexion, Sie wissen, eine Menge weniger. Da die Methode, die aufgerufen werden war nicht im code angegeben, keine dieser kann vorher getan werden, und die VM hat, Dinge zu tun, zur Laufzeit, die weit komplexer und Prozessorleistung.
Polymorphe Methodenaufrufe können aber von irgendwo zwischen diesen beiden extremen. Sie wissen nicht, was aufzurufende Methode erst zur Laufzeit ausgeführt, aber mindestens Sie können sicher sein, dass die Methode den Namen, die Argumente und den Rückgabetyp. Je mehr Sie wissen über das, was die Methode ausführen, die mehr Java kann vermieden werden, zur Laufzeit.
Dies beweist, dass die Reflexion langsamer, aber nicht, dass es tatsächlich "langsam". Wenn Sie brauchen, Reflexion oder polymorphe Methoden, die Sie verwenden, und speichern Sie das Urteil, was "langsam" für später.
Wenn Sie es in einer angemessenen Art und Weise, es ist nicht so langsam.
Zum Beispiel, ich habe es für die Prüfung der Eigenschaft von model-Klasse, es funktioniert perfekt.
In anderen Fällen, wie etwa die überprüfung, ob die Ziel-hat den gleichen Typ oder Signatur, es ist absolut langsam.
Fall ist es irgendwann langsam, aber es ist wichtig für die out-of-the-box-Umsetzung...:D.
Laut Oracle-Dokumentationen