2017-05-20 5 views
1

Stringの作成で、あるクラスのオブジェクトの作成のパフォーマンスをbyte[]から比較しようとしています。ここで私はこのために書いたのベンチマークされています。私は、次の結果得た私のマシン上で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}; 
    } 
} 

どこ

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 

は、それがこれを行うには正しい方法ですか?あるいは、私はベンチマークで何か間違いを犯し、何かを見逃しましたか?

+0

JVMは、毎回同じ単一インスタンスを返すように 'new TestClass()'(クラスの悪名、btw)を最適化し、 'i'と' str'(悪い名前)をそれぞれ1回だけ呼び出すこともあります。 –

+0

不正な名前について言えば、 'str'が同じ名前の2つの全く異なるメソッドであることを多重定義することが別の例です。 –

+0

@LewBlochそれは私がこれを尋ねる理由です。たぶんJVMは私が期待していなかったことをしました。常に同じインスタンスを返すようにする。 –

答えて

1

JITはリテラルString isntance( "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  

の方法は、それは多くの高速です理由です、登録RAXするアドレスを置くつの命令movabs RAX、0x1bc1f1440で構成されています。他の指示は補助的である。

str(Blackhole b)の場合、デフォルトの文字セットを取得し、メソッド呼び出しによってバイト配列をデコードすることで、Stringコンストラクタのコンパイル済みボディを含む多くのものが表示されます。

関連する問題