函数调用虚拟机查杀性能

jak*_*gut 4 c performance inline function vm-implementation

我在C中编写了一个虚拟机,其中有一个调用表填充了指向函数的指针,这些函数提供了VM的操作码的功能.当虚拟机运行时,它首先解释一个程序,创建一个索引数组,该索引数组对应于所提供操作码的调用表中的相应函数.然后它循环遍历数组,调用每个函数直到它到达结尾.

每条指令都非常小,通常是一行.适合内联.问题是编译器不知道何时将调用任何虚拟机的指令,因为它是在运行时决定的,所以它不能内联它们.函数调用和参数传递的开销正在扼杀我的VM的性能.关于如何解决这个问题的任何想法?

Ano*_*on. 5

以下是一些减少开销的选项:

  1. 将函数声明为fastcall(或类似的东西)以减少参数传递的开销
  2. 使用大型switch-case而不是函数指针表(编译器将优化到跳转表,并消除实际调用函数的开销)
  3. 将VM过程的所有代码复制到一个位置,以便它可以按顺序运行,而不是在每条指令后返回到解释器.

最终,你将会进入JIT编译,在线分析和重新优化以及各种其他令人敬畏的东西.