2011-06-02 5 views
2

私はC#でゲームサーバーを開発しています。特定のパケットがプレーヤーに毎秒3〜5回送信されます。そのパケットはPacketAと呼ばれます。私はそれを受け取ることを確認する以外は何もしません。空のブロックは最適化されていますか? C#

このパケットが最も多く送信されるので、最初にスイッチブロックに配置したいので、不要な比較をする必要はありません。コンパイラは、(私はスイッチブロックダウンすべての比較を行うことが原因となる?)とにかく、それを離れて最適化することになります

switch (packetId) 
{ 
    case PacketID.PacketA: // I do not want to do anything here. 
     break;    // Just avoid all other packet id comparisons. 

    case PacketID.PacketB: 
     HandlePacketB(data); 
     break; 

    case PacketID.PacketC: 
     HandlePacketC(data); 
     break; 

    // ... 

    case PacketID.PacketZ: 
     HandlePacketZ(data); 
     break; 
} 

をコンパイラがこれを離れて最適化しない場合は、どのように私は私のコードを変更することができますので、私は「ドン他のすべてのパケットIDをチェックする必要はありませんか?

答えて

6

C#のswitchステートメントは、どこを行くかを非常に迅速に評価できるように最適化されています。オプションのリストを正確に読み取ることはありません。代わりに、実行するケースを識別するために最適化したジャンプリストを作成します。ここではそれについての詳細な情報へのリンクです:

http://www.dotnetperls.com/switch-char

基本的に、私はあなたがそのようなそしてちょうどその最初のcaseためif文をやってて(別のステートメントと比較して、この文のパフォーマンスをテストすることをお勧めしますPacketAでなければswitch文を実行してください)。私は最終的にswitchステートメントが行く方法だと思います。

あなたは逆コンパイルすることで、あなたのアプリにそれを掘るしたいと判断した場合、あなたはTelerikから新しい(無料)ツールを使用することができます:それを逆アセンブルする方法についての詳細を追加

http://www.telerik.com/products/decompiling.aspx

+1

これは私の答えになるだろう。多くの人が 'Dictionary 'を使って推薦していますが、コンパイラがこのようなことを内部的にやっていることに気づいていません。私はどちらの場合でもパフォーマンスの違いは実際には分かりません。 – drharris

0

コードを逆アセンブルして、このケースが利用可能かどうかを確認してください。 それがavailablrでない場合、コンパイラはそれを最適化しました。

+1

マインドを?リフレクターはもはや自由ではありません。 – icktoofay

+0

@icktoofay: 'ildasm'にはVCが付いています。それを逆コンパイルしたいのであれば、ILSpyをチェックしてください:http://wiki.sharpdevelop.net/ILSpy.ashx – Gabe

+1

これは実際に(あなたが持っていれば、古いv6バージョンの条件を変更した)ものです。また、無料であるJetBrainsのdotPeekと結局はILDASMがあります。 –

関連する問題