从性能的角度来看,分支函数调用的最佳实现是什么?
在天真的情况下,我们有一个相当大的switch语句,它解释字节码并根据代码执行函数调用。
在正常情况下,我们计算了做同样事情的gotos和标签。
这样做绝对最好的方法是什么?
一个抽象的例子,
schedule: swap_entity(); goto *entity_start(); lb_code1: do_stuff(); goto *next_code_item(); lb_code2: do_stuff(); goto *next_code_item(); ...
编辑:我对“分支函数调用”的引用可能有点错误。分支代码执行。
答案 0 :(得分:3)
可能是一个函数指针数组,猜测:
void dispatch(Message* message)
{
//MessageType is a finite enum
MessageType messageType = message->messageType;
int index = (int)messageType;
//there's an array element for each enum value
FunctionPointer functionPointer = arrayOfFunctionPointers[index];
(*functionPointer)(message);
}
实际答案取决于硬件,取决于问题的大小和CPU的缓存等。
答案 1 :(得分:2)
这取决于。一些表驱动的方法通常会最快,但您可能会发现这是您的switch语句实现的。当然,你应该 不要把它当作这个领域的任何推荐 来自SO用户是最好的。如果我们提出建议,您需要实现它并在构建中测量性能,并启用所有编译器优化。
答案 2 :(得分:1)
如果你在这里寻找速度提升,你应该看看其他字节码调度机制。有a question which sort-of asked that before。
基本上,你现在有一个goto,每次都可能错误预测,然后是函数调用。使用类似direct threading的技术,您可以显着降低解释器开销。 Inline threading更难,但更有利。
我在另一个问题上给了一些further resources。