检查零是否更有效?

时间:2016-03-31 15:41:10

标签: c++ performance

哪个更有效率?

if(foo != 0)
{
    bar += foo;
}

bar += foo;

假设foo有可能成为0(比如25%,但可以对百分比做出其他假设,显然0%意味着后者总是更有效率)

关于何时应该使用其中一个,或者人们做分析以确定实际更有效的表达方式,是否存在共识?

3 个答案:

答案 0 :(得分:2)

对这么小的代码部分无法达成共识。有很多事情会严重影响性能,这些事情会根据围绕此if语句的代码的上下文而有所不同。

例如,如果你写:

onClick() {
    var picker = this.picker.pickatime('picker');
    picker.open().on({
        set: (thingSet) => {
            setTimeout(() => {
              self.zeit = this.get();
            });
        }
    });
}

if语句甚至不会出现在二进制结果中,因为编译器知道它总是为假。

关于0的检查,如果值很可能为0,则存在处理器启发式(称为分支预测),它自动检查过去if语句过去多少次(当它是in while / for loop)和"预测"声明的结果。

这个question显示了分支可能对代码性能产生的影响。

答案 1 :(得分:-1)

这不是真正必要的优化。 assembly

if(foo != 0)转换为两个汇编指令

bar += foo;也转化为两个

所以我想说,如果我们还添加if语句完成的小分支,我认为只要将foo添加到bar就更好了,即使多次不影响条形值。

答案 2 :(得分:-1)

当然检查更有效率。假设有25%的几率为0,所以在100次完全机会调用时你会跳过编译该行25次。因此,在最佳情况下,您的复杂性会降低25%。