簡體   English   中英

衡量Java中對象創建的性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM