【问题标题】:If/Else Statements or Equations?If/Else 语句或方程式?
【发布时间】:2013-12-05 06:52:51
【问题描述】:

问题:

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

  1. 哪个更快,为什么?还是差异太小以至于不显着?
  2. 其中之一是否更有活力?在某些情况下,其中一个可能不及另一个有什么原因吗?
  3. 哪个是更好/首选的代码,还是完全基于意见的实践?

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

示例(在 C++ 中):

鉴于以下广泛的场景,

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

如果x_not_y 为真而int y = n 相反,则目标是使int x = 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);

【问题讨论】:

  • 一个有趣的问题。起初我认为答案很明显,但现在我想等着看比我更有经验的人会怎么想!
  • 我冒着被过早的优化人员大喊大叫的风险,但答案是:“这取决于很多事情”
  • C++ 中没有“方程式”。只有语句,它们(除其他外)由表达式组成。
  • @Mysticial - 打败我。另外,请记住,您的编译器(几乎总是)比您聪明得多:)
  • 大多数关于分支预测优化的 hack 不符合 C 标准,因此往往依赖于编译器。

标签: c++ performance if-statement equation


【解决方案1】:

哪个更快,为什么?还是差异太小以至于不显着?

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

其中一个更有活力吗?在某些情况下,其中一个可能不及另一个有什么原因吗?

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

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

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

我特别讨厌这样的代码:

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,现在代码中只有该名称。

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

【讨论】:

  • 问题是关于在给定一个条件下设置两个不同值时的性能。
  • 我说得对吗?除了避免使用内联算法外,您还希望(如果可能)在一个语句中编写代码,以说明const 的原因?
  • @paddy:我试图改变我的答案来解决所有三个问题。但实际上,我还是会忽略前两个。
  • @Jim:不仅仅是const。即使x 不能是const,我也可能会使用它(因为它在代码中被进一步更改)。尽管如此,考虑到这一点,我想我会尽量减少变量值的改变,即使它们是非常量的,并且更喜欢结构语句(ifwhile 等)。但是,是的,我也更喜欢给简单的算法命名(通过将它们变成函数)。内联使这种抽象以零成本实现。
  • 我想它必须通常是特定于代码的,因为没有人说过“这个,不是那个”,但我绝对会接受这个建议。
【解决方案2】:

你的两个例子做了两个不同的事情:

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

您的等式同时更改 x 和 y,将一个设置为值 5,另一个设置为 0

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

【讨论】:

  • 这是评论,不是答案
  • 这条评论得到了很多人的支持。我没有看到任何答案。
  • 这个答案是错误的。如果之前声明了变量,请参考最后一段代码。
  • 为避免混淆,我删除了 2 个选项,只留下了您的答案所涉及的那个
猜你喜欢
  • 2022-12-07
  • 1970-01-01
  • 2019-04-09
  • 2022-07-05
  • 2014-12-03
  • 2017-02-05
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多