【发布时间】:2016-01-12 15:52:55
【问题描述】:
我需要从以下两个函数中删除尽可能多的 if 条件:
inline int inc_with_1bit_saturation(int counter)
{
if (counter == 1)
return --counter;
return ++counter;
}
void branch_prediction_1bit_saturation(int* input, int* output, int size)
{
int counter = 0;
for (int i = 0; i < size; ++i)
{
if (input[i] != counter)
{
counter = inc_with_1bit_saturation(counter);
output[i] = 0;
}
else output[i] = 1;
}
}
我该怎么做?if 分支是绝对必要的,不能删除,哪个可以用简单的按位运算或类似的东西代替?
更新 1
根据用户JSF 的精彩提示,代码现在如下所示:
void branch_prediction_1bit_saturation(int* input, int* output, int size)
{
int counter = 0;
for (int i = 0; i < size; ++i)
{
if (input[i] != counter)
{
counter = 1 - counter;
output[i] = 0;
}
else output[i] = 1;
}
}
更新 2
感谢Cantfindname,代码变成了这样:
void branch_prediction_1bit_saturation(int* input, int* output, int size)
{
int counter = 0;
for (int i = 0; i < size; ++i)
{
output[i] = counter == input[i];
counter = output[i] * counter + (1 - output[i])*(1 - counter);
}
}
这完全解决了这个问题。
【问题讨论】:
-
您的代码
counter = inc_with_1bit_saturation(counter);是一种非常低效的方法来执行counter=1-counter;第一个答案中的%2方法也不是很好。
标签: c++ optimization micro-optimization