2016-12-23 4 views
-2

アセンブリで次のコードスニペットのパフォーマンスを向上させるにはどうすればよいですか?私はこれをするためにどのような方法を提案してください? (私はそれはあなたが欲しいものではありません怖いが)最終的には実際にこのコードスニペットのパフォーマンスをアセンブリごとに向上させるにはどうすればよいですか?

void changeDirection(char key) { 
    /* 
     W 
    A + D 
     S 

    */ 
    switch (key) { 
    case 'w': 
     if (direction != 2) direction = 0; 
     break; 
    case 'd': 
     if (direction != 3) direction = 1; 
     break; 
    case 's': 
     if (direction != 4) direction = 2; 
     break; 
    case 'a': 
     if (direction != 5) direction = 3; 
     break; 
    } 
}/******increase performance*****/ 

おかげ

+4

私はかなり保証は現代の任意のコンパイラは、より速いアセンブリにそれを向けるだろうことができます大部分の開発者は手作業で生産することができます:-) – paxdiablo

+3

これは確かにこれはゲームのティックごとに1回しか実行されません。 – harold

+3

周囲の文脈なしで言うことは不可能です。 ASCII桁を数値にマッピングするための最適なasmを生成することは、数値に基づいて何か条件付きで実行する他のコードにインライン展開すると有効ではありません。うまくいけば、 'direction'は' static'なので、コンパイラはこの関数をインライン展開するときにコンパイラがより簡単にレジスタに最適化することができます。 –

答えて

3

は0-3の範囲対2-5の範囲は、乱用することは簡単であることが判明しました。

通常のゲームでは、キーの再定義が可能です。これにより、これが完全に破られます。だから、これは深刻な答えよりも「冗談」に似ています。しかし、あなたの質問は「冗談」の瀬戸際にもあります。つまり、あなたの投稿の中のことが問題だと本当に信じるなら、あなたはもっと深刻な問題を抱えています。

// I expect "direction" to be int, otherwise change wantDir vars 

void changeDirection2(char key) { 
    //          a  s d   w 
    constexpr static int wantDir[] = { ~0, 3, ~0, 2, 1, ~0, ~0, 0 }; 
    int wantedDir = wantDir[key&7]; 
    if (wantedDir+2 == direction) return; 
    direction = wantedDir; 
} 

これは、a、w、s、dよりも多くの(すべての)キーに反応します。それは、正しいものだけを使って発信者に電話をかけることです。


バージョン2、(まだ「AWSD」といくつかの番号に他のキーをマングリングにハードコード)LUTなし:

void changeDirection3(char key) { 
    int wantedDir = (~key>>1)&3; 
    if (wantedDir+2 == direction) return; 
    direction = wantedDir; 
} 
+0

upvoted回答その質問が30日以内に自動的に削除されるのを防ぎます。実際に*と呼ばれる場合、このLUTは実際には悪くない。もし、LUTを 'key * 4 'で可変カウントの右シフトとして実装してキャッシュを見逃してしまった場合、どうすれば低ニブルを取ることができますか?したがって、LUTは32ビットの定数であり、レジスタに「移動」します。 –

+0

'shl edi、2'/'mov eax、0x0FF12F3F' /' shrx eax、eax、edi'/'eax、0x0F'のようになります。たぶんcmovは分岐を処理するため、ストアは '方向'に常に起こります。そうでない場合、ストアを避けるための分岐は(その場合にのみ)タイトなループ内にある場合、 'direction'にループで運ばれる依存関係チェーンを避けるためです。 (なぜこのケースのためになるのだろうが、このアイデアを最適化が関係しているものに使用していた場合)... –

+0

@PeterCordesは、実際にはすぐに読んだ後に「右シフト」を理解できず、何かをしなければならなかった数秒間LCDに戻ってから、私の心は「考え出した」。 'wantedDir =((key >> 1)^ 3)&3;' ...あなたの提案をもう一度読みます。 :) – Ped7g

関連する問題