当前位置:  开发笔记 > 编程语言 > 正文

fastcall真的更快吗?

如何解决《fastcall真的更快吗?》经验,为你挑选了4个好方法。

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



1> Crashworks..:

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

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

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



2> Anon...:

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

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

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


在x64中,只有一个调用约定

3> Billy ONeal..:

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

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



4> ima..:

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


如果内联函数既不是fastcall也不是cdecl,也不是任何其他调用约定.
究竟.从L1获取寄存器是1个周期 - 在大多数情况下,它低于噪声水平,甚至难以可靠地对其进行基准测试.无论如何,应该内联几个周期中的重要区别的功能.
推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有