簡體   English   中英

一個空塊是否被優化掉了? C#

[英]Is an empty block optimized away? C#

我正在 C# 中開發游戲服務器,每個玩家每秒 3 到 5 次將特定數據包發送到我的服務器。 我們將該數據包PacketA 除了確保我收到它之外,我不會對它做任何事情。

由於這個數據包被發送的最多,我想把它放在開關塊的第一位,這樣我就不必做太多不必要的比較了。 編譯器最終會優化它嗎(這將導致我在 switch 塊中進行所有比較?)

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?

C# 中的switch語句經過優化,可以非常快速地評估 go 的位置。 它不會准確地閱讀選項列表。 相反,它會創建一個跳轉列表,並對其進行優化以識別要執行的案例。 這是一個鏈接,其中包含有關它的更多信息:

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

基本上,我建議您測試該語句與另一個語句相比的性能(例如,僅針對第一種case執行if語句,然后在不是PacketA時執行switch語句)。 我想最終switch語句是通往go的方式。

如果您決定通過反編譯來深入了解您的應用程序,您可以使用 Telerik 的新(免費)工具:

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

反匯編您的代碼並檢查這種情況是否可用。 如果它不可用,則編譯器對其進行優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM