Statischer Block vs statische Methode - Initialisierung statischer Felder

8

Aus Neugierde habe ich die Leistung zwischen statischem Block und statischem Methodeninitialisierer gemessen. Zuerst habe ich die oben genannten Methoden in zwei getrennten Java-Klassen implementiert:

Erstens:

%Vor%

Zweitens:

%Vor%

Dann habe ich dieses kleine Batch-Script ausgeführt, um es 100 Mal zu messen und die Werte in eine Datei zu schreiben. batchFile.bat First Second dum.res.txt

Danach habe ich diesen Code geschrieben, um den Mittelwert und die Standardabweichung der gemessenen Werte von Dummy und Muddy zu berechnen.

Das ist das Ergebnis, das ich habe:

%Vor%

Und es ist ähnlich auf meinen anderen Maschinen ... jedes Mal, wenn ich es teste.

Jetzt frage ich mich, warum ist es so? Ich überprüfte den Bytecode und Second.class hat eine Anweisung mehr (Aufruf von static initList ()) zwischen Aufrufen von System.currentTimeMillis (). Beide machen das gleiche, aber warum ist der Erste langsamer? Ich kann es nicht wirklich durchschauen, wenn ich nur auf den Bytecode schaue, da dies das erste Mal war, dass ich javap berührte; Ich verstehe Bytecode noch nicht.

    
nullpotent 18.11.2011, 21:36
quelle

2 Antworten

2

Ich denke, dass der Grund, warum die statische Blockversion langsamer ist als die statische Methodenversion, auf der unterschiedlichen JIT-Optimierung beruht, die sie bekommen ...

Siehe diesen interessanten Artikel für weitere interessante Informationen: Java Secret: Sind statische Blöcke interpretiert?

    
aleroot 18.11.2011, 22:16
quelle
2

Hier ist meine Vermutung über den Grund dafür:

Die Initialisierung, die Sie gerade durchführen, erzeugt genug Objekte, die eine oder mehrere Garbage-Collections verursachen.

Wenn die Initialisierung aus dem statischen Block aufgerufen wird, geschieht dies während der Klasseninitialisierung und nicht während der einfachen Methodenausführung. Während der Klasseninitialisierung muss der Mülldetektor möglicherweise etwas mehr tun (weil der Ausführungsstapel beispielsweise länger ist) als während der einfachen Methodenausführung, obwohl der Inhalt des Heapspeichers fast identisch ist.

Um dies zu testen, könnten Sie versuchen, -Xms200m oder etwas zu Ihren Java-Befehlen hinzuzufügen; Dies sollte die Notwendigkeit beseitigen, während der Initialisierung, die Sie tun, zu sammeln.

    
antlersoft 18.11.2011 22:21
quelle