如果我有一个数字a,那么在它上面添加1次而不是简单地添加+ b会更慢吗?
a += b;
或
for (int i = 0; i < b; i++) {
a += 1;
}
我意识到第二个例子看起来有点傻,但我有一种情况,编码实际上会更容易,我想知道这是否会影响性能。
编辑:谢谢你的所有答案。看起来有些海报想知道我的情况。我正在尝试编写一个函数,如果它是一个字母,则将输入字符移动一定数量的字符(即密码)。所以,我想说一个字符+ =移位的数量,但我还需要考虑ascii表上的小写字符和大写字符之间的跳转,以及从z回包到A.所以,虽然它以另一种方式可行,我认为继续添加一个直到我到达一个字母字符块结束,然后跳到下一个并继续前进是最容易的。答案 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)已存在很长时间了。基本的加法操作非常优化,比循环中的递增快得多。