今、私は ORM フレームワークを書いており、パフォーマンスに非常に気を配っています。
この Framework では、型の互換性をチェックする必要がinstanceof
あります。Class.isAssignableFrom
だから私は と のパフォーマンスについて少し疑問がinstanceof
ありますClass.isAssignableFrom
正確にはどれくらい遅いですか?
今、私は ORM フレームワークを書いており、パフォーマンスに非常に気を配っています。
この Framework では、型の互換性をチェックする必要がinstanceof
あります。Class.isAssignableFrom
だから私は と のパフォーマンスについて少し疑問がinstanceof
ありますClass.isAssignableFrom
正確にはどれくらい遅いですか?
instanceof はより高速であるはずです。これは 1 つのバイトコード操作です
public static void main(String[] args) {
boolean res1 = args instanceof Object;
バイトコード
ALOAD 0
INSTANCEOF java/lang/Object
ISTORE 1
と比較する
boolean res2 = Object.class.isAssignableFrom(args.getClass());
バイトコード
LDC Ljava/lang/Object;.class
ALOAD 0
INVOKEVIRTUAL java/lang/Object.getClass()Ljava/lang/Class;
INVOKEVIRTUAL java/lang/Class.isAssignableFrom(Ljava/lang/Class;)Z
ISTORE 2
instanceofはJAVA内でどのように実装されていますか?
簡単に言えば、プラットフォームに依存しているということです。
instanceof
長い答えは、を使用するテストケースを作成し、ループで実行してJITがコンパイルされることを確認してから、ネイティブコードをダンプして調べることで、実装方法を確認できるはずです。
ただし、これが特に有益になるとは思いません。あなたが本当に知りたいのは、速いかどうinstanceof
かです。Class.isAssignableFrom
これは、注意深いマイクロベンチマークによって測定できます。
FWIW、私はあなたがそれがより速いとわかるだろうと予測しますinstanceof
。instanceof
(JITコンパイラーは、リフレクティブバージョンを最適化できない方法で最適化できると期待しています。)
しかし最後に、この段階でこのレベルの最適化で時間を無駄にしないことをお勧めします。を使用してこれをコーディングし、使用法が実際にパフォーマンスのボトルネックであるinstanceof
ことを示すプロファイリングデータが得られるまで待ちます。instanceof
(「パフォーマンスを気にする」ことはすべて非常に良いことです...しかし実際には、パフォーマンスが重要な問題になる前に正しく理解する必要があるより重要なことがあります。)
まず第一に、これをマイクロベンチマークする場合は、タイミングに多くのノイズが見られるため、少なくとも大きなループを実行して平均します。
そうは言っても、はい、反射は遅いです。それを中心に設計し、他のものを使用できる場合は、それを実行してください。
たとえば、使用するクラスのセットが小さく、事前にわかっている場合は、それらを に保持し、Map<Class,[Something]>
そこで検索します。すべてのサブクラスをそのマップに含める必要がありますが、検索はより高速になります。 instanceof (これは基本的に、多くの高速シリアライゼーション ライブラリがリフレクションを回避する方法
です) 事前にこのマップを構築したくない場合は、実行時にキャッシュとして構築することができます。新しいクラス