4

今、私は ORM フレームワークを書いており、パフォーマンスに非常に気を配っています。

この Framework では、型の互換性をチェックする必要がinstanceofあります。Class.isAssignableFrom

だから私は と のパフォーマンスについて少し疑問がinstanceofありますClass.isAssignableFrom

正確にはどれくらい遅いですか?

4

3 に答える 3

7

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
于 2013-01-07T05:37:07.453 に答える
3

instanceofはJAVA内でどのように実装されていますか?

簡単に言えば、プラットフォームに依存しているということです。

instanceof長い答えは、を使用するテストケースを作成し、ループで実行してJITがコンパイルされることを確認してから、ネイティブコードをダンプして調べることで、実装方法を確認できるはずです。

ただし、これが特に有益になるとは思いません。あなたが本当に知りたいのは、速いかどうinstanceofかです。Class.isAssignableFromこれは、注意深いマイクロベンチマークによって測定できます。

FWIW、私はあなたがそれがより速いとわかるだろうと予測しますinstanceofinstanceof(JITコンパイラーは、リフレクティブバージョンを最適化できない方法で最適化できると期待しています。)

しかし最後に、この段階でこのレベルの最適化で時間を無駄にしないことをお勧めします。を使用してこれをコーディングし、使用法が実際にパフォーマンスのボトルネックであるinstanceofことを示すプロファイリングデータが得られるまで待ちます。instanceof(「パフォーマンスを気にする」ことはすべて非常に良いことです...しかし実際には、パフォーマンスが重要な問題になる前に正しく理解する必要があるより重要なことがあります。)

于 2013-01-07T07:06:16.720 に答える
1

まず第一に、これをマイクロベンチマークする場合は、タイミングに多くのノイズが見られるため、少なくとも大きなループを実行して平均します。
そうは言っても、はい、反射は遅いです。それを中心に設計し、他のものを使用できる場合は、それを実行してください。
たとえば、使用するクラスのセットが小さく、事前にわかっている場合は、それらを に保持し、Map<Class,[Something]>そこで検索します。すべてのサブクラスをそのマップに含める必要がありますが、検索はより高速になります。 instanceof (これは基本的に、多くの高速シリアライゼーション ライブラリがリフレクションを回避する方法
です) 事前にこのマップを構築したくない場合は、実行時にキャッシュとして構築することができます。新しいクラス

于 2013-01-07T05:10:46.073 に答える