[英]Measuring performance of object creation in Java
我試圖將創建某些類的對象與從byte[]
創建String
性能進行比較。 這是我為此編寫的基准:
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};
}
}
哪里
private static class TestClass{
private int i;
private String s;
public TestClass(Integer i, String s) {
this.i = i;
this.s = s;
}
}
在我的機器上,我得到以下結果:
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
這是正確的方法嗎? 還是我在基准測試中犯了一些錯誤並錯過了一些東西?
這是因為JIT知道字面字符串Nottance(“ asdasfa”)的確切地址。 因此,在這種情況下,無需創建新對象。 如果您反編譯str()方法,則可以清楚地看到它:
0x000000010dd1a2b0: sub rsp,0x18
0x000000010dd1a2b7: mov QWORD PTR [rsp+0x10],rbp ;
0x000000010dd1a2bc: movabs rax,0x1bc1f1440 ; {oop("asdasfa")}
0x000000010dd1a2c6: add rsp,0x10
0x000000010dd1a2ca: pop rbp
0x000000010dd1a2cb: test DWORD PTR [rip+0xfffffffffe642d2f],eax # 0x000000010c35d000;
0x000000010dd1a2d1: ret
該方法由一條指令movabs rax,0x1bc1f1440組成,該指令將地址放入rax寄存器,這就是為什么它要快得多的原因。 其他說明是輔助的。
對於其他方法str(Blackhole b),您將看到更多內容,包括String構造函數的編譯主體,該主體具有默認字符集和通過方法調用對字節數組進行解碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.