我使用 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/