c - 为什么asm代码在C中的函数比c代码函数花费更多的时间?

标签 c gcc assembly time inline-assembly

我使用 GCC 的 "asm" 关键字用 C 语言编写了一个简单的乘法函数,并用汇编代码编写了另一个函数。

我计算了它们每个的执行时间,虽然它们的时间非常接近,但 C 函数比汇编代码中的函数快一点。

我想知道为什么,因为我期望 asm 更快。是因为GCC的“asm”关键字有额外的“call”(我不知道该用什么词)吗?

这是 C 函数:

int multiply (int a, int b){return a*b;}

这是 C 文件中的 asm:

int asmMultiply(int a, int b){  
    asm ("imull %1,%0;"
             : "+r" (a)           
             : "r" (b)
    );
    return a;
}

我主要花时间的地方:

int main(){
   int n = 50000;
   clock_t asmClock = clock();
   while(n>0){
       asmMultiply(4,5);
       n--;
    }

   asmClock = clock() - asmClock;  
   double asmTime = ((double)asmClock)/CLOCKS_PER_SEC; 

   clock_t cClock = clock();
   n = 50000;
   while(n>0){
       multiply(4,5);
       n--;
   }
   cClock = clock() - cClock;  
   double cTime = ((double)cClock)/CLOCKS_PER_SEC;  

  printf("Asm time: %f\n",asmTime);
  printf("C code time: %f\n",cTime);

谢谢!

最佳答案

汇编函数比 C 函数做更多的工作 - 它初始化 mult,然后进行乘法并将结果分配给 mult,然后将值从mult 进入返回位置。

编译器善于优化;在基本算术上你不会轻易击败他们。

如果你确实想要改进,请使用static inline int multiply(int a, int b) { return a * b; }。或者只需在调用代码中写入 a * b (或等效内容),而不是 int x =multiply(a, b);

关于c - 为什么asm代码在C中的函数比c代码函数花费更多的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54849386/

相关文章:

c++ - 重新分配而不释放旧内存

c++ - Mac 中的 GCC 与 Linux 中的 GCC

multithreading - `xchg` 是否包含 `mfence` 假设没有非时间指令?

arrays - 使用 MASM 和 Irvine32 库打印数组

使用 C 和汇编程序计算整数的符号

c - 为什么输出是一个框中的问号而不是数字

c - 为什么“while(!feof(file))”总是错误的?

c++ - 如何检查两个任意内存范围在 c/c++ 中不重叠

linux - 设置 ostream linux/visual studio 的指数字段的宽度

c - 如何编译 GCC 生成的 asm?