c - 哪个更快,乘法还是减法?

标签 c performance optimization

<分区>

我目前正在做一个大学项目,该项目在很大程度上取决于我的解决方案的速度和效率。我对代码所做的微小更改会产生巨大的影响,因为我正在编写的特定函数被调用了数十万次。

我现在已经编写了项目的主要功能,目前正在尽我所能优化一切。我质疑的代码的一个特定部分如下所示:

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 *= -1t = 0 - t 都生成:

neg QWORD PTR [rbp-0x8]

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

相关文章:

c - Win32 编程与现代专业人士的相关性如何?

c - 赋值语句后的段错误(lex 和 yacc)

android - 如何检测android cpu速度?

python - Python 中 3-D 点之间的最小、平均和最大距离

c - 为什么 GCC 会将字复制到返回寄存器而不是字节?

javascript - 如何配置 gulpjs,以便 ngrok 模块可用于为 pagespeed Insight 插件提供 url?

c - 字符串数组与用户字符串比较给出访问错误

c - 两个子进程通过命名管道进行通信

python - 使用 cython 加速 numpy 矩阵乘法

c++ - 在堆栈上使用大变量/数组的缺点?