Ich versuche, die Leistung der Erstellung des Objekts einer Klasse mit der Erstellung von String
von byte[]
zu vergleichen. Hier ist der Maßstab ich dies schrieb:Messung der Leistung der Objekterstellung in Java
public class MyBenchmark {
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void tsts(Blackhole b) {
b.consume(new TestClass(i(), str()));
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void str(Blackhole b) {
b.consume(new String(b()));
}
@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public String str(){
return "asdasfa";
}
@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public int i(){
return 23;
}
@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public byte[] b(){
return new byte[]{49, 66, 43, 65, 78, 123, 96, 54};
}
}
wo
private static class TestClass{
private int i;
private String s;
public TestClass(Integer i, String s) {
this.i = i;
this.s = s;
}
}
Auf meinem Rechner habe ich die folgenden Ergebnisse:
Benchmark Mode Cnt Score Error Units
MyBenchmark.str avgt 20 47.695 ± 1.869 ns/op
MyBenchmark.tsts avgt 20 6.999 ± 0.191 ns/op
Ist es richtig Weg, dies zu tun? Oder habe ich einen Fehler im Benchmark gemacht und etwas verpasst?
Vielleicht hat die JVM 'new TestClass()' (schlechter Name für eine Klasse, btw) so optimiert, dass sie jedes Mal die gleiche Instanz zurückgibt und somit "i" und "str" (mehr schlechte Namen) jeweils nur einmal aufruft. –
Apropos schlechte Namen, das Überladen von 'str' zu zwei völlig verschiedenen Methoden mit dem gleichen Namen ist ein weiteres Beispiel. –
@LewBloch Deshalb frage ich das. Vielleicht hat JVM etwas getan, was ich nicht erwartet habe. Wie immer die gleiche Instanz. –