Heim >Java >javaLernprogramm >Wie stark wirkt sich die Verwendung von Reflection auf die Leistung der Objekterstellung in Java aus?

Wie stark wirkt sich die Verwendung von Reflection auf die Leistung der Objekterstellung in Java aus?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-03 08:41:13856Durchsuche

How Much Does Using Reflection Impact Object Creation Performance in Java?

Auswirkungen der Reflexion auf die Objekterstellungsleistung in Java

Wenn Entwickler die Reflexionsfunktionen von Java nutzen, um Objekte zu instanziieren, treten häufig Bedenken hinsichtlich der nachfolgenden Leistung auf Implikationen. Um diese Bedenken zu bewerten, untersuchen wir, ob das Erstellen von Objekten mithilfe von Reflektion anstelle des direkten Aufrufs des Klassenkonstruktors erhebliche Leistungsunterschiede mit sich bringt.

Laut der offiziellen Java-Dokumentation zur Reflektion gibt es tatsächlich eine bemerkenswerte Auswirkung auf die Leistung. Da bei der Reflexion Typen dynamisch aufgelöst werden, können bestimmte JVM-Optimierungen nicht angewendet werden. Dies führt dazu, dass reflektierende Vorgänge im Vergleich zu nicht reflektierenden Gegenstücken von Natur aus langsamer sind.

Um diesen Unterschied zu quantifizieren, betrachten Sie den folgenden Codeausschnitt:

public class Main {

    public static void main(String[] args) throws Exception {
        doRegular();
        doReflection();
    }

    public static void doRegular() throws Exception {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1,000,000; i++) {
            A a = new A();
            a.doSomeThing();
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    public static void doReflection() throws Exception {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1,000,000; i++) {
            A a = (A) Class.forName("misc.A").newInstance();
            a.doSomeThing();
        }
        System.out.println(System.currentTimeMillis() - start);
    }
}

class A {
    public void doSomeThing() {
        // Perform some task
    }
}

Ausführen dieses Codes auf einem Sun JRE 6u10-System liefert folgende Ergebnisse:

  • Reguläre Objekterstellung: 35 Millisekunden
  • Objekterstellung mit Reflektion: 465 Millisekunden

Diese Ergebnisse zeigen eine erhebliche Leistungseinbuße bei der Verwendung von Reflektion, die auf die Kosten für die Durchführung von Laufzeitklassensuchen und Instanziierung zurückzuführen ist.

Selbst wenn wir den Reflexionscode optimieren, indem wir die Klassensuche nur einmal durchführen, bevor wir mehrere Objekte instanziieren, gibt es immer noch eine Leistung hit:

  • Reguläre Objekterstellung: 30 Millisekunden
  • Objekterstellung mithilfe von Reflektion mit einem Suchvorgang: 47 Millisekunden

Zusammenfassend lässt sich sagen, dass Reflektion in Java a erheblicher Leistungsaufwand im Vergleich zu direkten Konstruktoraufrufen. Während es bestimmte Anwendungsfälle geben kann, in denen eine Überlegung erforderlich ist, ist es wichtig, die potenziellen Auswirkungen auf die Leistung zu berücksichtigen, wenn der Einsatz in Betracht gezogen wird, insbesondere bei leistungskritischen Anwendungen.

Das obige ist der detaillierte Inhalt vonWie stark wirkt sich die Verwendung von Reflection auf die Leistung der Objekterstellung in Java aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn