<分区>
我目前正在做一个大学项目,该项目在很大程度上取决于我的解决方案的速度和效率。我对代码所做的微小更改会产生巨大的影响,因为我正在编写的特定函数被调用了数十万次。
我现在已经编写了项目的主要功能,目前正在尽我所能优化一切。我质疑的代码的一个特定部分如下所示:
array[i] *= -1;
我正在考虑优化到:
array[i] = 0 - array[i];
更改此代码真的会影响速度吗?减法运算是否比乘法运算快?还是此类问题已成为过去?
<分区>
我目前正在做一个大学项目,该项目在很大程度上取决于我的解决方案的速度和效率。我对代码所做的微小更改会产生巨大的影响,因为我正在编写的特定函数被调用了数十万次。
我现在已经编写了项目的主要功能,目前正在尽我所能优化一切。我质疑的代码的一个特定部分如下所示:
array[i] *= -1;
我正在考虑优化到:
array[i] = 0 - array[i];
更改此代码真的会影响速度吗?减法运算是否比乘法运算快?还是此类问题已成为过去?
最佳答案
忽视了您可能应该改用它的事实:
array[i] = -array[i];
因为 IMO 更清晰,因为它直接说明了意图,让我们检查一下编译器(x86-64 上的 GCC 4.7.2)为这个程序做了什么:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t t = time(NULL);
t *= -1;
return 0;
}
gcc -S mult.c -o 1.s
And for this:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t t = time(NULL);
t = 0 - t;
return 0;
}
gcc -S sub.c -o 2.s
现在比较两个汇编输出:
diff 1.s 2.s
什么都不打印。编译器为两个版本生成了完全相同的代码。所以答案是:使用什么并不重要。编译器会选择最快的。这是一个非常容易进行的优化(如果您甚至可以将其称为优化),因此我们可以假设几乎每个编译器都会为给定的 CPU 架构选择最快的方法来完成它。
作为引用,生成的代码是:
int main() { time_t t = time(NULL); mov edi,0x0 call 12 mov QWORD PTR [rbp-0x8],rax t *= -1; neg QWORD PTR [rbp-0x8] t = 0 - t; neg QWORD PTR [rbp-0x8] return 0; mov eax,0x0 }
在这两种情况下,它都使用 NEG 来取反值。 t *= -1
和 t = 0 - t
都生成:
neg QWORD PTR [rbp-0x8]
关于c - 哪个更快,乘法还是减法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13513867/