如果条件来自简单功能,则删除

Den*_*nko 1 c++ optimization micro-optimization

我需要从以下两个函数中删除尽可能多的条件:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做,什么if分支是绝对必要的,不能被删除,哪一个可以被简单的按位运算或类似的东西取代?

更新1

根据User 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这完全解决了这个问题.

Can*_*ame 6

对于循环内的if语句:

output[i] = (int)(input[i]==counter);
counter = output[i]*counter + (1-output[i])*(1-counter) //used JSF's trick
Run Code Online (Sandbox Code Playgroud)

True转换为1,false转换为0,根据这个:bool到int转换

  • 按位运算符可能更快:`counter =(output [i]&counter)| ((1-output [i])&(1- counter));` (2认同)
  • 或者`!(counter ^ output [i])`也许`1-(counter ^ output [i])`如果优化器不那么聪明,效果会更好.`counter ^ =(1-output [i])`如果优化器真的很差. (2认同)