If/Else语句或公式?

Jam*_*ley 0 c++ performance equation if-statement

问题:

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

  1. 哪个更快,为什么?或者差异是否太小而不显着?
  2. 其中一个更有活力吗?在某些情况下,他们中的一个可能会与另一个相遇吗?
  3. 哪个是更好/首选的代码,还是完全基于意见的做法?

(我指的是C++,但由于这个问题是半通用的,因此也可以参考或与其他语言进行比较.)

示例(在C++中):

鉴于以下广泛的情况,

int n = (anything);
bool x_not_y = (declared as random boolean value);
Run Code Online (Sandbox Code Playgroud)

目标是使int x = nif x_not_y成立,int y = n而恰恰相反,使用if/else语句更好:

if (x_not_y)
    x = 5;
else
    y = 5;
Run Code Online (Sandbox Code Playgroud)

(以下简称)

x_not_y?x = 5:y = 5;
Run Code Online (Sandbox Code Playgroud)

或者使用方程式

x = (x * (int)!x_not_y) + (5 * (int)x_not_y);
y = (y * (int)x_not_y) + (5 * (int)!x_not_y);
Run Code Online (Sandbox Code Playgroud)

sbi*_*sbi 7

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

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

其中一个更有活力吗?在某些情况下,他们中的一个可能会与另一个相遇吗?

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

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

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

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

int x;
if( some_condition )
    x = 5;
else
    x = 42;
Run Code Online (Sandbox Code Playgroud)

为了理解这样的代码,必须跟踪每个变量的值并遵循每个语句.另外,x不能在const这里,我认为这是一个字符串的缺点.

我更喜欢

const int x = calc_x(some_condition); 
Run Code Online (Sandbox Code Playgroud)

在这个例子中,这个例子很简单,可以写成

const int x = some_condition ? 5 : 42;
Run Code Online (Sandbox Code Playgroud)

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

当然,这段代码非常简单,实际上并不需要我列出的好处,但是当你处理更复杂的现实代码时,我发现,从长远来看,更实用的方法更好.