私はアプリケーションに取り組んでいますが、ある設計アプローチではinstanceof
演算子を非常に多用しています。OO 設計では の使用を避けるようにすることが一般的であることは知っていますがinstanceof
、それは別の話で、この質問は純粋にパフォーマンスに関するものです。パフォーマンスに影響があるかどうか疑問に思っています。 は と同じくらい速いですか==
?
たとえば、10 個のサブクラスを持つ基本クラスがあるとします。基本クラスを受け取る単一の関数で、クラスがサブクラスのインスタンスであるかどうかをチェックし、いくつかのルーチンを実行します。
私が考えた他の解決方法の 1 つは、代わりに「type id」整数プリミティブを使用し、ビットマスクを使用してサブクラスのカテゴリを表し、サブクラスの「type id」とカテゴリを表す定数マスクのビットマスク比較を実行することでした。
JVM によって、それよりも高速になるように何らかの形で最適化されているのでしょinstanceof
うか? Java を使い続けたいのですが、アプリのパフォーマンスが重要です。この道を歩んだことがある人がアドバイスをくれると嬉しいです。私は細かいことにこだわりすぎているのでしょうか、それとも最適化すべき点を間違えているのでしょうか?
ベストアンサー1
アプローチ
私が書いたベンチマークプログラムさまざまな実装を評価するには:
instanceof
実装(参考)@Override
抽象クラスとテストメソッドによるオブジェクト指向- 独自の型実装を使用する
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()