Java の Instanceof パフォーマンス
Java で継承を扱うとき、開発者は、instanceof 演算子の使用がパフォーマンスに影響を与えるかどうかという問題によく遭遇します。オブジェクト指向の設計では、instanceof の使用を最小限に抑えようとしていることが理解されていますが、このクエリはパフォーマンスへの影響のみに焦点を当てています。
一般的なシナリオでは、複数のサブクラスを持つ基本クラスが存在し、関数はその基本クラスで動作します。各サブクラスに対してinstanceofチェックを実行します。別のアプローチでは、サブクラスの分類にビットマスクを備えた「タイプ ID」整数プリミティブを使用します。このアプローチでは、JVM が優れた速度を実現するために、instanceof を最適化しているかどうかという疑問が生じます。
ベンチマーク結果
さまざまな実装オプションを評価するために、ベンチマーク プログラムが作成されました。オプションには以下が含まれます:
ベンチマークは、10,000 回の反復にわたる各オプションの平均実行時間を測定します。
パフォーマンス分析
結果は、Java 1.8 では getClass( ) 僅差でした。要約は次のとおりです。
Operation | Runtime | Relative to instanceof |
---|---|---|
INSTANCEOF | 39,598 ns/op | 100.00% |
GETCLASS | 39,687 ns/op | 100.22% |
TYPE | 46,295 ns/op | 116.91% |
OO | 48,078 ns/op | 121.42% |
結論
Java 1.8 では、instanceof はクラス インスタンスをチェックするための最速のアプローチを表します。 getClass() は同等のパフォーマンスを発揮しますが、TYPE やオブジェクト指向継承などの代替アプローチでは、パフォーマンスが若干低下します。最適なパフォーマンスを求める開発者は、他のオプションよりもinstanceofを優先する必要があります。
以上がJavaのinstanceofは本当に遅いのでしょうか?ベンチマーク調査の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。