0

「アプリでテストする」ことが必須であることは知っています。とはいえ、分析的な洞察も求めたいと思います。

Array要素が順次処理されるアプリ内命令キューを (として) 持っています。詳細は関係ありません。(「命令」を仮想命令と考えてください。つまり、小さな内部仮想マシンのように、アプリケーションの観点からのみ解釈されます)。

実際の問題は、キュー要素を処理するのにどちらが高速かということです。Java によって提供される仮想ディスパッチとswitch-case?

  1. 最初のケースでは、Arrayは独自のオブジェクトの子孫で構成されていOperationます (または、単純にRunnable-- 要点がわかります)。この場合、命令の実行はOperation.run()オブジェクトのオーバーライドを呼び出すだけです。仮想ディスパッチが残りを行いrun()ます。具体的なインスタンスの が呼び出されます。

  2. Arrayプリミティブ配列で、各要素は連続した範囲 (たとえば、 0..65535intの間) からの命令コードです。int命令処理とは、(A)switch-caseステートメントを介して、または (B)命令コードによって直接インデックス付けされたArray(オブジェクトの) を使用して、命令コードが解釈されることを意味します。Operation

2 番目のケースでは、switch-case最近では十分に最適化されていると思います (特に、連続した範囲を使用しているため)。そのため、Arrayオプションを忘れることができます。

結論から言うと、どちらが速いですか?の分岐に解釈コードを追加するswitch-caseか、仮想ディスパッチを使用しますか?

私はそれがこれに分解すると思います:switch-caseより速いですか、それとも仮想ディスパッチですか? a は分岐テーブルまたはジャンプ命令に最適化できると読みましたswitch-caseが、この場合は可能になると思います。

4

2 に答える 2

1

あなたの switch ステートメントは「密」であるため、複数の継承スキームよりも高速である必要があると感じています。ほとんどの場合、コンパイラは整数インデックスに基づいてテーブル ルックアップに最適化します。繰り返しになりますが、2番目の選択肢で「invokevirtual」オペコードを実行するために、コンパイラが(内部的に)継承スキームを高速に解決する可能性は低いと思います...特に基本クラスが継承されている場合多くのバリエーションで。

于 2012-09-29T18:55:15.810 に答える
0

基本的にはカスケードされたif/elseif/...と同じなので、swtich-caseは遅い(そして読みにくい)と思います。正しいケースブランチが見つかるまで、ここで多くの比較が必要になります。直接アクセスするには、正しい命令に直接アクセスできる必要があります。(これらすべての仮説的および理論的なもので、あなたの質問を正しく理解できたことを願っています)

于 2012-09-29T15:32:00.993 に答える