是否在一个数字中加1比在C ++中同时添加所有内容慢?

时间:2014-12-05 21:52:51

标签: c++

如果我有一个数字a,那么在它上面添加1次而不是简单地添加+ b会更慢吗?

a += b;

for (int i = 0; i < b; i++) {
  a += 1;
}

我意识到第二个例子看起来有点傻,但我有一种情况,编码实际上会更容易,我想知道这是否会影响性能。

编辑:谢谢你的所有答案。看起来有些海报想知道我的情况。我正在尝试编写一个函数,如果它是一个字母,则将输入字符移动一定数量的字符(即密码)。所以,我想说一个字符+ =移位的数量,但我还需要考虑ascii表上的小写字符和大写字符之间的跳转,以及从z回包到A.所以,虽然它以另一种方式可行,我认为继续添加一个直到我到达一个字母字符块结束,然后跳到下一个并继续前进是最容易的。

5 个答案:

答案 0 :(得分:3)

如果你的循环真的那么简单,我没有看到编译器无法优化它的任何理由。我不知道是否有任何 。如果您的编译器没有单独添加将比循环更多

答案 1 :(得分:2)

语言C ++没有描述这些操作需要多长时间。编译器可以自由地将您的第一个语句转换为第二个语句,这是编译它的合法方法。

实际上,许多编译器会将这两个子表达式视为相同的表达式,假设所有类型都是int类型。然而,第二个是脆弱的,因为看似无害的变化会导致大规模的性能下降。 “不应该重要”的类型的微小变化,附近的额外声明等等。

第一个比第二个慢得多是极少的,但如果a的类型是+= b比调用+= 1一个慢得多的操作有时候,它可能是。例如;

struct A {
  std::vector<int> v;
  void operator+=( int x ) {
    // optimize for common case:
    if (x==1 && v.size()==v.capacity()) v.reserve( v.size()*2 );
    // grow the buffer:
    for (int i = 0; i < x; ++i)
      v.reserve( v.size()+1 );
      v.resize( v.size()+1 );
    }
  }
};

然后A a; int b = 100000; a+=b;将比循环结构花费更长的时间。

但我必须努力工作。

答案 2 :(得分:1)

在循环中增加变量的开销(CPU指令)与该循环中的指令总数相比可能无关紧要(除非你在循环中做的唯一事情是递增)。循环变量可能保留在CPU缓存的低级别(如果不在CPU注册表中),并且非常快速递增,因为不需要通过FSB从RAM读取。无论如何,如果有疑问,只需快速了解一下,你就会知道牺牲代码的可读性是否有意义。

答案 3 :(得分:0)

是的,绝对慢。第二个例子是愚蠢的。我非常怀疑你有这样的情况,这样做是有意义的。

让我们说&#39; b&#39;是500,000 ...大多数计算机可以在一次操作中添加,为什么要进行500,000次操作(不包括循环开销)。

答案 4 :(得分:0)

如果处理器有增量指令,编译器通常会翻译&#34;添加一个&#34;操作为增量指令。

某些处理器可能具有优化的增量指令,以帮助加速循环等操作。其他处理器可以将增量操作与加载或存储指令组合。

有一个只包含增量指令的小循环有可能被乘法和加号替换。当且仅当功能相同时,才允许编译器这样做。

这种操作通常会产生微不足道的结果。但是,对于大型数据集和性能关键型应用程序,这种操作可能是必要的,并且所获得的时间将是巨大的。

编辑1:
对于添加1以外的值,编译器将发出处理器指令以使用最佳的加法运算。

添加操作在硬件中优化为与增量不同的动物。算术逻辑单元(ALU)已存在很长时间了。基本的加法操作非常优化,比循环中的递增快得多。