[英]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 的新(免費)工具:
反匯編您的代碼並檢查這種情況是否可用。 如果它不可用,則編譯器對其進行優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.