2011-06-02 53 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

基本上,我建議你測試這一說法相比,另一份聲明性能(比如做一個if語句只是第一case然後如果它不是PacketA,則執行switch聲明)。我可以想象,最後switch聲明是要走的路。

如果你決定要通過反編譯鑽研你的應用程序,你可以使用來自Telerik的新的(免費)工具:

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

+1

這是我的答案。很多人推薦使用'Dictionary ',但不知道編譯器在內部執行了這樣的事情。我認爲你不會真的看到性能差異。 – drharris 2011-06-02 05:11:02

0

反彙編你的代碼,並檢查這種情況是否可用。 如果它不可用,那麼編譯器會優化它。

+1

心靈將如何拆解它更多的細節?反射器不再是免費的。 – icktoofay 2011-06-02 05:03:31

+0

@icktoofay:'ildasm'自帶VC。如果你想反編譯它,看看ILSpy:http://wiki.sharpdevelop.net/ILSpy.ashx – Gabe 2011-06-02 05:06:39

+1

它實際上是(他們改變了舊的v6版本的條款,如果你有的話)。另外,JetBrains dotPeek是免費的,畢竟是ILDASM。 – 2011-06-02 05:08:15