If / Else语句或公式?

时间:2013-12-04 22:18:41

标签: c++ performance if-statement equation

的问题:

在处理布尔值时,使用if语句或方程通常是否更好?请解决以下问题,请记住,您的答案应适用于大多数(如果不是全部)代码:

  1. 哪个更快,为什么?或者差异是否太小而不显着?
  2. 其中一个更有活力吗?在某些情况下,是否有一个原因可能会与另一个相悖?
  3. 哪个是更好/首选的代码,还是完全基于意见的做法?
  4. (我指的是C ++,但由于这个问题是半通用的,因此也会对其他语言的引用或比较表示赞赏。)

    示例(在C ++中):

    鉴于以下广泛的情况,

    int n = (anything);
    bool x_not_y = (declared as random boolean value);
    

    目标是int x = n如果x_not_y为真而int y = n恰恰相反,那么使用 if / else语句会更好吗:

    if (x_not_y)
        x = 5;
    else
        y = 5;
    

    (以下简称)

    x_not_y?x = 5:y = 5;
    

    或使用等式

    x = (x * (int)!x_not_y) + (5 * (int)x_not_y);
    y = (y * (int)x_not_y) + (5 * (int)!x_not_y);
    

2 个答案:

答案 0 :(得分:7)

  

哪个更快,为什么?或者差异是否太小而不显着?

我怀疑这样的代码会对现代优化器产生影响,但如果你想知道,我们首先要问,什么平台,什么编译器?,然后我们需要测量。

  

其中一个是否更具活力?在某些情况下,是否有一个原因可能与另一个相悖?

由于我碰巧相信您的编译器的优化器可以同等地处理所有这些,我建议编写易于理解和维护的代码,并且只有在测量显示这是一个热点之后才能处理优化。

  

哪个是更好/首选的代码,还是完全基于意见的做法?

随着时间的推移,我发现我越来越倾向于功能范式。我喜欢通过代码的结构更好地表达分支,而不是通过变量值,我更喜欢尽可能多地表达(甚至是语言环境变量)。

我特别学会不喜欢这样的代码:

int x;
if( some_condition )
    x = 5;
else
    x = 42;

为了理解这样的代码,必须跟踪每个变量的值并遵循每个语句。此外,x此处不能const,我认为这是一个字符串劣势。

我非常喜欢

const int x = calc_x(some_condition); 

,在这个例子中很简单的情况下,可以写成

const int x = some_condition ? 5 : 42;

现在x可以是const(允许编译器阻止我无意中做傻事),实现算法的代码片段找出x应该是什么一个名称(calc_x()),而不是算法inline,现在只有该名称在代码中。

当然,这段代码很简单,它并不真正需要我列出的好处,但是当你处理更复杂的现实代码时,我发现,从长远来看,一个更实用的方法会更好。

答案 1 :(得分:-1)

你的两个例子做了两件事:

IF语句改变x或y,而另一个不变。

你的等式改变了x& y,将1设置为值5,将另一个设置为0

也就是说,if语句可能会遭受分支错误预测惩罚,而第二种形式则不会(以难以阅读为代价)。