fastcall真的更快吗?
快速调用约定是否比其他调用约定更快,如cdecl? 那里是否有任何基准显示如何通过调用约定来影响性能?
这取决于平台。 例如,对于Xenon PowerPC来说,由于在堆栈上传递数据,存在load-hit-store问题,所以它可能是一个数量级差异。 我经验性地将cdecl
函数的开销定为45个周期,而快速调用则为4个。
对于无序的x86(Intel和AMD)来说,其影响可能要小得多,因为无论如何寄存器都被映射并重命名。
答案的确是你需要在你关心的特定平台上进行基准testing。
快速调用约定是否比其他调用约定更快,如cdecl?
我相信,x86和x64上的fastcall
实现快速调用涉及将前两个parameter passing到寄存器而不是堆栈中。
由于它通常至less节省了四次内存访问,所以通常速度更快。 但是,如果涉及的function是注册不足的,因此可能将它们写入堆栈中的当地人,则不太可能有显着的增加。
调用约定(至less在x86上)在速度上并没有太大的差别。 在Windows中, _stdcall
是默认的,因为它为非平凡程序产生了有形的结果,与_cdecl
相比,它通常会导致较小的代码大小。 _fastcall
不是默认值,因为它所做的差异远没有那么明显。 你在通过寄存器传递的参数中弥补了你在function效率较低的函数体中的损失(如前所述)。 如果被调用的函数立即需要将所有内容泄漏到内存中以进行自己的计算,则不会通过传入寄存器获得任何收益。
但是,我们可以整天提出理论思路 – 以您的代码为基准来寻找正确的答案。 某些情况下_fastcall
会更快,而其他情况则会更慢。
在现代的x86 – 没有。 在L1caching和内嵌之间没有快速拨号的地方。