关键路径尽量用整数运算代替浮点运算
【说明】 在目前的主流CPU和DSP下,浮点运算相对于整数运算而言,开销增加数倍;关键路径上,通过优化计算过程,采用整数计算替代浮点数计算能够优化性能表现。
另外,由于整数的乘法和除法是单机器指令,而浮点运算不论哪种方式都包含多个指令(如下),因此,避免采用浮点数乘除法计算对性能提升的效果也非常显著:
- 软浮点:编译器把浮点运算转换成函数调用。
- 硬浮点:编译器把代码编译成硬件浮点协处理器能识别的指令,在执行时,Arm核直接将它转给协处理器执行。效率相对高;
【注意事项】 采用整数计算代替浮点数计算,需要以满足精度条件作为前提;
【案例】
优化前:
uint32_t Func(float input)
{
float tbl[6] = { 5, 10, 15, 20, 25, 12.5 };
for (uint32_t i = 0; i < sizeof(tbl) / sizeof(tbl[0]); i++) {
if (((tbl[i] - 0.001) < input) && (input < (tbl[i] + 0.001))) {
return i;
}
}
return UINT32_MAX;
}
优化后:
uint32_t Func(uint32_t input)
{
uint32_t tbl[6] = { 50, 100, 150, 200, 250, 125 };
for (uint32_t i = 0; i < sizeof(tbl) / sizeof(tbl[0]); i++) {
if (tbl[i] == input) {
return i;
}
}
return UINT32_MAX;
}
说明:结合上下文语境,将该函数的入参数据类型从float类型修改为int类型(数据放大10倍),进行数据比较,可以避免浮点数运算与比较,提高性能。
父主题: 语句