fastcall真的更快吗?

时间:2010-02-02 23:56:04

标签: c++ performance calling-convention fastcall

fastcall调用约定是否真的比其他调用约定更快,例如cdecl? 是否有任何基准测试表明调用约定会影响性能?

4 个答案:

答案 0 :(得分:31)

这取决于平台。例如,对于Xenon PowerPC,由于在堆栈上传递数据的加载命中存储问题,它可能是一个数量级的差异。我凭经验将约{45}周期的cdecl函数的开销计时,而fastcall的约为{4}。

对于无序的x86(Intel和AMD),影响可能会小得多,因为无论如何寄存器都被遮蔽并重命名。

答案实际上是你需要在你关心的特定平台上自己进行基准测试。

答案 1 :(得分:17)

  

fastcall调用约定是否真的比其他调用约定更快,例如cdecl?

我相信x86和x64上的fastcall的微软实现涉及将前两个参数传递给寄存器而不是堆栈。

因为它通常可以节省至少四次内存访问,是的,它通常更快。但是,如果所涉及的功能是寄存器缺乏的,因此无论如何都可能将它们写入堆栈中的本地,那么就不可能有显着的增加。

答案 2 :(得分:11)

调用约定(至少在x86上)并没有太大的速度差异。在Windows中,_stdcall被设为默认值,因为它为非平凡程序产生了切实的结果,因为与_cdecl相比,它通常会导致更小的代码大小。 _fastcall不是默认值,因为它所带来的差异远不那么明显。你在通过寄存器传递的参数中弥补了你在效率较低的函数体中丢失的东西(如前面Anon所述)。如果被调用函数需要立即将所有内容溢出到内存中以供自己计算,则不会通过传入寄存器获得任何内容。

但是,我们可以整天兜售理论创意 - 为您的代码提供正确答案的基准。 _fastcall在某些情况下会更快,而在其他情况下会更慢。

答案 3 :(得分:10)

在现代x86上 - 没有。在L1缓存和内部之间没有快速呼叫的地方。