c - 为什么 C 中的 asm 代码函数比 c 代码函数花费更多时间?
问题描述
"asm"
我使用 GCC 的关键字在 C 中编写了一个简单的乘法函数,并在汇编代码中编写了另一个函数。
我计算了它们每个的执行时间,虽然它们的时间非常接近,但 C 函数比汇编代码中的快一点。
我想知道为什么,因为我希望 asm 更快。是因为对 GCC 的“asm”关键字有额外的“调用”(我不知道该用什么词)吗?
这是C函数:
int multiply (int a, int b){return a*b;}
这是asm
C文件中的一个:
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);
.
推荐阅读
- python - 创建线程和进程之间的时间差异
- reactjs - 使材料-ui面包屑显示名称而不是反应中的其他值
- android - 如何防止android设备后退按钮在颤动中回到启动画面?
- regex - 在 Dart/Flutter 中使用 Regex 从文档中获取 YouTube URL
- javascript - 创建一个按钮,其边框逐渐减少 onClick 并在时间“0”触发事件
- hyperledger-fabric - 如何使用 Amazon DynamoDB 而不是 couchDB 在超级账本结构中存储链下数据
- corda - 查询消费Linear状态的事务的Corda事务id
- python - 跨多列的单热编码 - 但作为一组
- reactjs - reactjs中的组件重新渲染
- python - 如何修复“导入 QtWidgets 时 DLL 加载失败”?