10

標準のSun1.6コンパイラとJRE/JITを使用して、Duff's Deviceに例示されているような大規模な展開を使用して、ループを展開することをお勧めしますか?それとも、パフォーマンス上の利点がなく、コードが難読化されてしまうのでしょうか。

私が使用したJavaプロファイリングツールは、たとえばvalgrindよりも行ごとのCPU使用率についての情報が少ないため、他の人の経験で測定を強化することを検討していました。

もちろん、 Duff's Deviceを正確にコーディングすることはできませんが、基本的な展開を行うことはできます。それが私が疑問に思っていることです。

        short stateType = data.getShort(ptr);
        switch (stateType) {

        case SEARCH_TYPE_DISPATCH + 16:
            if (c > data.getChar(ptr + (3 << 16) - 4)) {
                ptr += 3 << 16;
            }
        case SEARCH_TYPE_DISPATCH + 15:
            if (c > data.getChar(ptr + (3 << 15) - 4)) {
                ptr += 3 << 15;
            }
         ...

他の多くの値を下に移動します。

4

2 に答える 2

26

それが良いアイデアかどうかは大した問題ではありません (そうではありません)。コンパイルされないからです。

編集:これはJLS で明示的に言及されています:

Duff のデバイスとして知られるトリックを C または C++ で使用してループをアンロールできますが、これは Java プログラミング言語では有効なコードではありません。

または、より率直に(同じセクションから):

すばらしいハックだ、トム、でもここでは通用しない。

編集:より(あまりにも)一般的な質問に答えるには、通常はいいえ。通常、JIT に依存する必要があります。

于 2010-03-16T01:25:44.143 に答える
9

Java がスタック指向の仮想マシンのバイトコードにコンパイルされるという事実を無視しています。Java レベルでどのような低レベルの最適化トリックを試みても、ほとんど効果がありません。実際の最適化は、JIT コンパイラがターゲット アーキテクチャのアセンブリを生成するときに行われます。このプロセスは、ほとんどの場合、制御することも気にすることもできません。

代わりに、より大きな画像で最適化する必要があります。JIT コンパイラーに低レベルの最適化を処理させます。

于 2010-03-16T01:43:17.290 に答える