gpt4 book ai didi

c++ - 为什么fastcall比stdcall慢?

转载 作者:IT老高 更新时间:2023-10-28 13:02:20 24 4
gpt4 key购买 nike

我发现了以下问题:Is fastcall really faster?

没有给出 x86 的明确答案,所以我决定创建基准。

代码如下:

#include <time.h>

int __fastcall func(int i)
{
return i + 5;
}

int _stdcall func2(int i)
{
return i + 5;
}

int _tmain(int argc, _TCHAR* argv[])
{
int iter = 100;
int x = 0;
clock_t t = clock();
for (int j = 0; j <= iter;j++)
for (int i = 0; i <= 1000000;i++)
x = func(x & 0xFF);
printf("%d\n", clock() - t);
t = clock();
for (int j = 0; j <= iter;j++)
for (int i = 0; i <= 1000000;i++)
x = func2(x & 0xFF);
printf("%d\n", clock() - t);
printf("%d", x);
return 0;
}

如果在 MSVC 10 中没有优化结果是:

4671
4414

使用最大优化 fastcall 有时会更快,但我猜这是多任务处理的噪音。这是平均结果(iter = 5000)

6638
6487

stdcall 看起来更快!

以下是 GCC 的结果:http://ideone.com/hHcfP再次,fastcall 输了比赛。

这是 fastcall 的反汇编部分:

011917EF  pop         ecx  
011917F0 mov dword ptr [ebp-8],ecx
return i + 5;
011917F3 mov eax,dword ptr [i]
011917F6 add eax,5

这是 stdcall:

    return i + 5;
0119184E mov eax,dword ptr [i]
01191851 add eax,5

i 是通过 ECX 传递的,而不是堆栈,而是保存在 body 的堆栈中!所以所有的效果都被忽略了!这个简单的函数可以只使用寄存器来计算!它们之间并没有真正的区别。

谁能解释 fastcall 的原因是什么?为什么它不提供加速?

编辑:经过优化,这两个函数都是内联的。当我关闭内联时,它们都被编译为:

00B71000  add         eax,5  
00B71003 ret

这看起来确实是一个很好的优化,但它根本不尊重调用约定,所以测试是不公平的。

最佳答案

__fastcall 是在 很久 之前引入的。当时,Watcom C++ 在优化方面击败了微软,许多评论者认为它基于寄存器的调用约定是一个(可能的)原因。

Microsoft 通过添加 __fastcall 作为回应,从那以后他们一直保留它——但我认为他们所做的还远远不够能够说“我们有一个寄存器——也基于调用约定...”他们的偏好(尤其是自从 32 位迁移以来)似乎是 __stdcall。他们在使用它改进代码生成方面投入了大量工作,但(显然)使用 __fastcall 并没有那么多。使用片上缓存,在寄存器中传递内容的 yield 并不像当时那么大。

关于c++ - 为什么fastcall比stdcall慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5479362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com