我们正在为高级编译语言编写字节码,经过一些分析和优化后,很明显,当前最大的性能开销是我们用来跳转到字节码情况的 switch 语句。
我们研究了提取每个 case 标签的地址并将其存储在字节码流本身中,而不是我们通常打开的指令 ID。如果这样做,我们可以跳过跳转表,直接跳转到当前正在执行的指令的代码位置。这在 GCC 中效果非常好,但是,MSVC 似乎不支持这样的功能。
我们尝试使用内联汇编来获取标签的地址(并跳转到它们),并且它有效,但是,使用内联汇编会导致 MSVC 优化器避免整个函数。
有没有办法让优化器仍然运行代码?不幸的是,我们无法将内联汇编提取到除创建标签的函数之外的另一个函数中,因为即使在内联汇编中也无法引用另一个函数的标签。有什么想法或想法吗?非常感谢您的意见,谢谢!
在 MSVC 中执行此操作的唯一方法是使用内联汇编(这对于 x64 来说基本上是个麻烦事):
int _tmain(int argc, _TCHAR* argv[])
{
case_1:
void* p;
__asm{ mov [p],offset case_1 }
printf("0x%p\n",p);
return 0;
}
如果你打算做这样的事情,那么最好的方法是用汇编语言编写整个解释器,然后通过链接器将其链接到主二进制文件(这就是 LuaJIT 所做的,这也是 VM 如此糟糕的主要原因)当它不运行 JIT 代码时,速度快得令人眼花缭乱)。
LuaJIT 是开源的 http://luajit.org/,所以如果你走那条路,你可能会从中得到一些提示。或者,您可能想研究第四种的来源(其创建者开发了原则 http://en.wikipedia.org/wiki/Threaded_code你正在尝试使用),如果有一个 MSVC 构建,你可以看到他们是如何完成它的,否则你就只能使用 GCC(它isn't一件坏事,它适用于所有主要平台)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)