【发布时间】:2017-03-10 00:20:06
【问题描述】:
我们有一种将命令数据写入设备的方法。该方法首先将数据转换为设备接受的形式,然后将数据写入串口。数据转换是通过下面给出的 case 语句完成的。对于 10 个命令,我们需要转换数据。对于其他命令,我们不必转换数据(大约 10 个命令)。
客户抱怨代码未优化。一些不需要数据转换的命令是经常使用的。
if else 语句会直接优化代码吗?
在这种情况下是否有任何其他选项可以优化代码?
switch (cmd_no)
{
case CMD_WR_ACC:
converted_command_data = (INT32)((((DOUBLE)cmd_data * CMD_WR_ACC_PARA1) / CMD_WR_ACC_PARA2) + 0.5);
break;
case CMD_WR_BIAS:
converted_command_data = (INT32)((((DOUBLE)cmd_data * CMD_WR_BIAS_PARA1) / CMD_WR_BIAS_PARA2) + 0.5);
break;
case CMD_WR_SUP:
converted_command_data = (INT32)((((DOUBLE)cmd_data * CMD_WR_SUP_PARA1) / CMD_WR_SUP_PARA2) + 0.5);
break;
case CMD_WR_FIL:
converted_command_data = (INT32)((((DOUBLE)cmd_data * CMD_WR_FIL_PARA1) / CMD_WR_FIL_PARA2) + 0.5);
break;
.
.
default:
converted_command_data = cmd_data;
break;
}
【问题讨论】:
-
有必要使用double吗?
-
首先:测量它。其次:if/else ifs 的构造实际上是切换的最坏情况。
-
“客户抱怨代码未优化。”您如何定义优化?为什么上面的代码没有被认为是优化的?你对问题的定义还不够。
-
使用
static inline或许还有一个早期的 if 语句来处理最频繁的命令(如果确实有的话),应该可以解决问题。 -
如果
cmd_data和所有*_PARA1和*_PARA2都是整数,那么您可以重写呈现的转换以仅使用整数算术。这可能会使那些速度更快。
标签: c optimization