首页 > 解决方案 > 为什么 C 中的 asm 代码函数比 c 代码函数花费更多时间?

问题描述

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

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

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

这是C函数:

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

这是asmC文件中的一个:

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);

谢谢!

标签: cgccassemblytimeinline-assembly

解决方案


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

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

如果您真的想要改进,请使用static inline int multiply(int a, int b) { return a * b; }. 或者只是a * b在调用代码中编写(或等效的)而不是int x = multiply(a, b);.


推荐阅读