c - 哪个更快 : bitshift vs switch

标签 c performance networking

我正在设计一款基于多人 RTS 图 block 的游戏,其中所有游戏逻辑均由服务器处理(用 C 语言编写),并且客户端是在 Unity 中制作的,以便于跨平台部署。

我正在设计一个将通过 TCP 发送的自定义协议(protocol),我的问题是从效率的角度来看,而不是数据大小 POV(权衡),我是否最好使用按位运算符来确定用户尝试执行的操作或者我应该只使用 char(byte) 并将 int 值输入到 switch 语句中?还是我缺少另一种更有效的方法?

如果我采用按位路由,它将有 2 个字节长,本质上会被读取为一个位数组,其中 2 个字节中“1”的位置将决定将采取什么操作以及数据包的其余部分应如何进行被阅读。 例如

for (int i = 0; i < sizeof(unsigned short); ++i)
{
  if((pkt & 1) > 0)
  {
    /* call correct function for bit at index 'i' with 
       remaining packet data (minus these 2 header bytes) */
  }
  pkt >> 1;
}

或者我应该采取更清晰的读取方式(假设是字节数组或 char* :

)
char val = pkt[0]
switch (val)
{
  case 65: 
      /* call relevant function */
         break;
  case 66: 
     /* call relevant function */
        break;
 }

这些示例假设我已经读取了前 4 个字节中接收到的数据的大小

任何有关我应该采取哪条路线的见解都非常感谢!

最佳答案

跳转表可能是最快的:

/* declaration of action functions */
int action1(char *data);
int action2(char *data);
int action3(char *data);
int action4(char *data);
int action5(char *data);
/* Filler */
int nop(char *data) { return 0; }

/* declare jumptable action as an array of function pointers of suitable type */
int (*action[])(char*) = { action1, action2, action3, action4, action5, nop, nop, nop };


/* Call function */
char val = pkt[0] & 0x07;  
result = (action[val])(pkt+2);

关于c - 哪个更快 : bitshift vs switch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41827276/

相关文章:

C Grid 使用指针和 Malloc

jquery - 什么时候在 CSS3 上使用 javascript 是正确的,反之亦然?

database - Linq 与数据库 View

c - 将数据添加到特定协议(protocol)的数据包中

c# - 是否有关于使用 C# 客户端创建 C++ 聊天服务器的文章或建议?

C 中的命令行参数返回大数

c - while循环中的malloc

python - 在Python中设计类似C的结构的最佳方法

python - 如何在不评估的情况下拆分 Django 查询集?

内部专用网络上的 SSL 证书