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
は、それがこれを行うには正しい方法ですか?あるいは、私はベンチマークで何か間違いを犯し、何かを見逃しましたか?
JVMは、毎回同じ単一インスタンスを返すように 'new TestClass()'(クラスの悪名、btw)を最適化し、 'i'と' str'(悪い名前)をそれぞれ1回だけ呼び出すこともあります。 –
不正な名前について言えば、 'str'が同じ名前の2つの全く異なるメソッドであることを多重定義することが別の例です。 –
@LewBlochそれは私がこれを尋ねる理由です。たぶんJVMは私が期待していなかったことをしました。常に同じインスタンスを返すようにする。 –