是否优化了空块?C#

Mar*_*lon 2 c# compiler-optimization

我正在用C#开发一个游戏服务器,每个玩家每秒发送一次特定的数据包3到5次.我们将调用该数据包PacketA.我不做任何事情,除非确保收到它.

由于这个数据包的发送最多,我想把它放在开关块中,所以我不必进行那么多不必要的比较.编译器最终是否会最终优化它(这将导致我对开关块进行所有比较?)

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;
}
Run Code Online (Sandbox Code Playgroud)

如果编译器确实对此进行了优化,那么如何更改代码以便我不必检查所有其他数据包ID?

IAm*_*rey 6

switchC#中的语句以一种允许快速评估去向的方式进行优化.它不会准确地读取选项列表.相反,它会创建一个优化的跳转列表,用于识别要执行的案例.这是一个包含更多相关信息的链接:

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

基本上,我建议你测试这个语句的性能与另一个语句相比(比如先做一个if语句case,然后再做一个switch语句,如果不是PacketA).我想,最后switch声明是要走的路.

如果您决定通过反编译来挖掘应用程序,可以使用Telerik的新(免费)工具:

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