分支优化

时间:2009-08-26 20:07:09

标签: c optimization branch

从性能的角度来看,分支函数调用的最佳实现是什么?

在天真的情况下,我们有一个相当大的switch语句,它解释字节码并根据代码执行函数调用。

在正常情况下,我们计算了做同样事情的gotos和标签。

这样做绝对最好的方法是什么?

一个抽象的例子,

schedule: 
    swap_entity();
    goto *entity_start();

lb_code1:
    do_stuff();
    goto *next_code_item();

lb_code2:
    do_stuff();
    goto *next_code_item();

...

编辑:我对“分支函数调用”的引用可能有点错误。分支代码执行。

3 个答案:

答案 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