As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




已关闭8年。




我目前正在做一个大学项目,该项目在解决方案的速度和效率上有很高的评价。我对代码进行的微小更改会产生巨大的影响,因为我正在编写的特定函数被称为数十万次。

我已经编写了项目的主要功能,并且目前正在优化我可能做的所有事情。我要查询的代码的特定部分看起来像这样:
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

现在比较两个程序集输出:

差异1.s 2.s

什么都没有打印。编译器为两个版本生成了完全相同的代码。答案是:使用什么都没有关系。编译器将选择最快的方法。这是一个非常容易的优化(如果您甚至可以称其为优化),因此我们可以假设实际上,对于给定的CPU体系结构,那里的每个编译器都会选择最快的方法。

作为引用,生成的代码为:

int main()
{
time_t t = time(NULL);
mov edi,0x0
致电12
mov QWORD PTR [rbp-0x8],rax

t * = -1;
否QWORD PTR [rbp-0x8]

t = 0-t;
否QWORD PTR [rbp-0x8]

返回0;
mov eax,0x0
}

在这两种情况下,它都使用NEG取反值。 t *= -1t = 0 - t都生成:

否QWORD PTR [rbp-0x8]

关于c - 乘还是减,哪个更快? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13513867/

10-12 19:41