6

Java では、キャストを行うのにどれくらいコストがかかりますか:

(MyObject) IObject;

対:

i++;

その前に「int i = N」と仮定します。

編集:

よろしければ、(i++) との直接的な比較を少しの間無視してください。これをより一般的な言葉で言い換えてみましょう: 一般的にキャスティングはどれくらいの費用がかかりますか? 私の単純な「i++」の例よりも優れた参照操作を選択してください。たとえば、単純な変数宣言と割り当てを取り上げます。キャストの実行は、VM バイトコード/操作の観点からどのように比較されますか?

i++ を測定スティックとして使用しました。それは非常に悪い考えでした。ベースラインとして「メートル」を選択すると、はるかに優れた結果が得られました。Javaの運用コストの基本測定単位はありますか? JVMオペレーション?これは、Java op がコンパイルされるネイティブ コードに依存すると思います...とにかく、キャストのコストはどれくらいですか? (あなたは私のために測定棒を選んでください、私はそれが苦手です)

4

1 に答える 1

1

2番目の部分で簡単な回答をします(キャストの費用はどれくらいですか):

キャストは非常に安価で、重要な部分で大幅に最適化されています。 if (o instanceof Clazz) ((Clazz)o)完全に無料です(チェック自体ではなく、キャスト)。

全体として、キャストがコンパイラーによって証明され、定数が折りたたまれていれば、費用はかかりません。それ以外の場合は、クラスを決定するためにオブジェクトのヘッダーにロードする必要があります。一部の JVM は、ポインターの一部を使用してクラスを格納できますが、これは重要です。とにかく、ロードでさえ安価で、L1 キャッシュにヒットする可能性があります。実質的にすべてのキャスト ブランチは、ハードウェアによって正しく予測されます。

配列は一般に、多くの理由でコレクション フレームワークとそのジェネリックよりも大幅に高速ですが、キャスト自体は非常に小さな役割を果たします。

最後に: 露骨な「測定」です。つまり、マイクロベンチマークは恐ろしいアイデアであることが多く、アプリケーションのパフォーマンス全体を測定するのが正しい方法です。マイクロベンチマークでは、JVM がどのように最適化するか (またはしないか) を深く理解する必要があり、実際に必要なものをベンチマークする必要があります。全体として、それ自体が芸術です。

于 2012-06-09T18:19:48.817 に答える