Javaでinstanceofを使用した場合のパフォーマンスへの影響 質問する

Javaでinstanceofを使用した場合のパフォーマンスへの影響 質問する

私はアプリケーションに取り組んでいますが、ある設計アプローチではinstanceof演算子を非常に多用しています。OO 設計では の使用を避けるようにすることが一般的であることは知っていますがinstanceof、それは別の話で、この質問は純粋にパフォーマンスに関するものです。パフォーマンスに影響があるかどうか疑問に思っています。 は と同じくらい速いですか==?

たとえば、10 個のサブクラスを持つ基本クラスがあるとします。基本クラスを受け取る単一の関数で、クラスがサブクラスのインスタンスであるかどうかをチェックし、いくつかのルーチンを実行します。

私が考えた他の解決方法の 1 つは、代わりに「type id」整数プリミティブを使用し、ビットマスクを使用してサブクラスのカテゴリを表し、サブクラスの「type id」とカテゴリを表す定数マスクのビットマスク比較を実行することでした。

JVM によって、それよりも高速になるように何らかの形で最適化されているのでしょinstanceofうか? Java を使い続けたいのですが、アプリのパフォーマンスが重要です。この道を歩んだことがある人がアドバイスをくれると嬉しいです。私は細かいことにこだわりすぎているのでしょうか、それとも最適化すべき点を間違えているのでしょうか?

ベストアンサー1

アプローチ

私が書いたベンチマークプログラムさまざまな実装を評価するには:

  1. instanceof実装(参考)
  2. @Override抽象クラスとテストメソッドによるオブジェクト指向
  3. 独自の型実装を使用する
  4. getClass() == _.class実装

私はジェイエム100回のウォームアップコール、1000回の測定反復、10回のフォークでベンチマークを実行しました。つまり、各オプションは10,000回測定され、macOS 10.12.4とJava 1.8を搭載したMacBook Proでベンチマーク全体を実行するのに12:18:57かかりました。ベンチマークは各オプションの平均時間を測定します。詳細については、GitHubでの私の実装

完全を期すために:この回答の以前のバージョンと私のベンチマーク

結果

| 操作 | 操作あたりの実行時間 (ナノ秒単位) | instanceof に相対 |
|------------|--------------------------------------|-------------------------|
| インスタンス | 39,598 ± 0,022 ns/op | 100,00 % |
| GETCLASS | 39,687 ± 0,021 ns/op | 100.22 % |
| タイプ | 46,295 ± 0,026 ns/op | 116,91 % |
| OO | 48,078 ± 0,026 ns/op | 121.42 % |

要約

Java 1.8 では、非常に近いinstanceofものの、最も速いアプローチです。getClass()

おすすめ記事