gpt4 book ai didi

c++ - 通过函数指针计算的 goto/jump 与 fastcall 哪个成本更高?

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:10 25 4
gpt4 key购买 nike

我进退两难,对于 VM 的循环来说,什么是性能更好的选择:

选项 1 - 强制内联指令函数,使用计算的 goto 切换到该标签上指令的调用(有效的内联代码)...或...

选项 2 - 使用函数指针查找数组,每个指针指向一个 fastcall 函数,指令确定索引。

基本上,最好是带有跳转地址和内联代码的查找表或带有fastcall 函数地址的查找表。是的,我知道,两者实际上只是内存地址并来回跳转,但我认为 fastcall 如果超出寄存器空间,即使被迫使用,仍可能导致某些数据被插入堆栈注册参数。

编译器是 GCC。

最佳答案

我假设,对于“虚拟机”,您指的是执行某种字节码的模拟处理器,类似于“Java 虚拟机”,而不是允许安装另一个操作系统的完整模拟计算机(如在 VirtualBox 中/VMware)。

我的建议是让编译器来决定什么具有最佳性能,并在字节码流的当前项上创建一个传统的大“开关”。这可能会导致编译器创建一个跳转表,因此它与您计算的 goto 变体一样快(或慢),但更便携。

您的变体 2 - 查找函数指针数组 - 可能比内联函数慢,因为非内联函数可能会有额外的开销,例如返回值的处理。毕竟,您的某些 VM-op 函数(如“goto”或“set-register-to-immediate”)必须修改指令指针,而其他函数则不需要。

通常,调用函数指针(或通过跳转表跳转)在当前 CPU 上很慢,因为分支预测很难正确预测它们。因此,如果您考虑优化您的 VM,请尝试找到一组需要尽可能少的代码点的指令。

关于c++ - 通过函数指针计算的 goto/jump 与 fastcall 哪个成本更高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18172008/

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