我正在用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?
答案 0 :(得分:6)
C#中的switch
语句以一种允许快速评估去向的方式进行优化。它不会准确地读取选项列表。相反,它会创建一个优化的跳转列表,用于识别要执行的案例。以下链接提供了有关它的更多信息:
http://www.dotnetperls.com/switch-char
基本上,我建议您测试此语句的性能与另一个语句的比较(例如,仅针对第一个if
执行case
语句,然后执行switch
语句如果不是PacketA
)。我想,最后switch
语句是要走的路。
如果您决定通过反编译来深入了解您的应用,可以使用Telerik的新(免费)工具:
答案 1 :(得分:0)
反汇编代码并检查此案例是否可用。 如果它不可用,则编译器对其进行优化。