38
ここでは、比較の対象となるスレッドが多数見つかりました。どちらが速いのかは、newInstance
またはnew operator
です。newInstanceとjdk-9/jdk-8の新機能とjmh
ソースコードを見ると、newInstance
は、のはるかに遅いと思われます。は非常に多くのセキュリティチェックとリフレクションを使用しています。そして私は最初にjdk-8を実行して測定することに決めました。コードはjmh
です。
@BenchmarkMode(value = { Mode.AverageTime, Mode.SingleShotTime })
@Warmup(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
@State(Scope.Benchmark)
public class TestNewObject {
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder().include(TestNewObject.class.getSimpleName()).build();
new Runner(opt).run();
}
@Fork(1)
@Benchmark
public Something newOperator() {
return new Something();
}
@SuppressWarnings("deprecation")
@Fork(1)
@Benchmark
public Something newInstance() throws InstantiationException, IllegalAccessException {
return Something.class.newInstance();
}
static class Something {
}
}
私は(JITはこの差はない大きなことを確認最適化の多くはありません)、大きな驚きがここにあるとは思わない:
Benchmark Mode Cnt Score Error Units
TestNewObject.newInstance avgt 5 7.762 ± 0.745 ns/op
TestNewObject.newOperator avgt 5 4.714 ± 1.480 ns/op
TestNewObject.newInstance ss 5 10666.200 ± 4261.855 ns/op
TestNewObject.newOperator ss 5 1522.800 ± 2558.524 ns/op
ホットコードの違いは次のようになり約2xとなり、単発時間はずっと悪くなります。
ここで私はjdk-9(重要な場合は、ビルド157)に切り替えて、同じコードを実行します。 と結果:
Benchmark Mode Cnt Score Error Units
TestNewObject.newInstance avgt 5 314.307 ± 55.054 ns/op
TestNewObject.newOperator avgt 5 4.602 ± 1.084 ns/op
TestNewObject.newInstance ss 5 10798.400 ± 5090.458 ns/op
TestNewObject.newOperator ss 5 3269.800 ± 4545.827 ns/op
ホットコードで50倍違いを百日咳です。私は最新のjmhバージョン(1.19.SNAPSHOT)を使用しています。ここで
@Fork(1)
@Benchmark
public Something newInstanceJDK9() throws Exception {
return Something.class.getDeclaredConstructor().newInstance();
}
は、全体的な結果のn JDK-9以下のとおりです:
テストにもう一つの方法を追加した後、誰かがにいくつかの光を当てることができます
TestNewObject.newInstance avgt 5 308.342 ± 107.563 ns/op TestNewObject.newInstanceJDK9 avgt 5 50.659 ± 7.964 ns/op TestNewObject.newOperator avgt 5 4.554 ± 0.616 ns/op
は、このような大きな存在である理由差異?
ジグソーパズル付きのJDK9ビルドを使用していますか? –
@JornVerneeは重要ではないとは確信していますが、答えはノーです - 私はそうではありません。 – Eugene
モジュールの追加のアクセスチェックが数多くあるため、JITがうまく処理する方法を知らない可能性があるので、問題になります。 –