Die Reflexion ist langsam, obwohl die Objektzuweisung nicht so hoffnungslos ist wie andere Aspekte der Reflexion. Um eine gleichwertige Leistung mit reflexionsbasierter Instanziierung zu erreichen, müssen Sie Ihren Code so schreiben, dass das Jit erkennen kann, welche Klasse gerade instanziiert wird. Wenn die Identität der Klasse nicht bestimmt werden kann, kann der Zuweisungscode nicht inlined werden. Schlimmer noch, die Escape-Analyse schlägt fehl, und das Objekt kann nicht auf dem Stack zugewiesen werden. Wenn Sie Glück haben, kann das Laufzeit-Profiling der JVM zur Rettung kommen, wenn dieser Code heiß wird, und dynamisch bestimmen, welche Klasse vorherrscht und für diese optimieren.
Seien Sie sich bewusst, dass die Mikrobenchmarks in diesem Thread sehr fehlerhaft sind, nehmen Sie sie also mit Vorsicht zur Kenntnis. Der bei weitem am wenigsten fehlerhafte ist der von Peter Lawrey: Er führt Aufwärmläufe durch, um die Methoden in Gang zu bringen, und er unterläuft (bewusst) die Escape-Analyse, um sicherzustellen, dass die Zuweisungen tatsächlich stattfinden. Aber auch das hat seine Probleme: zum Beispiel kann man davon ausgehen, dass die enorme Anzahl von Array-Speichern Caches und Speicherpuffer aushebelt, so dass dies hauptsächlich ein Speicher-Benchmark sein wird, wenn Ihre Zuweisungen sehr schnell sind. (Hut ab vor Peter, dass er die richtige Schlussfolgerung gezogen hat: dass der Unterschied "150ns" und nicht "2,5x" ist. Ich vermute, dass er so etwas beruflich macht).
0 Stimmen
Verwandt: Gibt es eine Möglichkeit, den reflektiven Methodenaufruf in Java weiter zu optimieren?