2

我处于两难境地,VM循环的性能更高的选项是什么:

选项 1 - 对指令函数强制内联,使用计算的 goto 进行 switch 来调用该标签上的指令(有效内联代码)......或者......

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

基本上,更好的是带有跳转地址和内联代码的查找表或带有fastcall函数地址的查找表。是的,我知道,两者实际上都只是内存地址并且来回跳转,但我认为fastcall如果寄存器空间不足,即使强制使用寄存器作为参数,仍然可能导致一些数据被压入堆栈。

编译器是 GCC。

4

1 回答 1

1

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

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

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

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

于 2013-08-11T20:23:46.267 回答