是否优化了空块? C#

时间:2011-06-02 04:59:05

标签: 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;
}

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

2 个答案:

答案 0 :(得分:6)

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

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

基本上,我建议您测试此语句的性能与另一个语句的比较(例如,仅针对第一个if执行case语句,然后执行switch语句如果不是PacketA)。我想,最后switch语句是要走的路。

如果您决定通过反编译来深入了解您的应用,可以使用Telerik的新(免费)工具:

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

答案 1 :(得分:0)

反汇编代码并检查此案例是否可用。 如果它不可用,则编译器对其进行优化。