区间分支

时间:2015-10-27 16:03:18

标签: c++ c++11 optimization branching-strategy

我正在研究的一个项目(C ++ 11)涉及一段代码,它将在数万亿次的某个地方运行。我在[1,N]中有一个整数参数B,而点1 = b1< b2< ......< bk = N,其中代码执行不同的小代码块,具体取决于B所处的区间[bi,b(i + 1))。整个执行过程中唯一改变的值是B.但是bi的值是# 39; s是固定的,它们仅在运行时确定。

天真的事情是编写一堆if和else if语句,在最坏的情况下涉及k比较。然而,可以在恒定时间内完成此操作:构造大小为N的向量myGotos并且在每个区间[bi,b(i + 1))存储相应代码块的位置。然后你就转到myGotos [B]。

上面的解决方案在我看来平均来说会更快,但代码会非常难看。我想知道是否有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

执行此操作的常用方法是使用switch语句

switch(B){
case b1:..//
        break;
}

如果您可以将这些代码段声明为lambdas或std :: function,只要它们使用相同的参数。即使是模板化函数也可以。在不知道实际需要运行这些功能的情况下很难回答。

map<int,decltype(yourLambda)>

似乎它也能正常工作。

答案 1 :(得分:1)

初始化一个N个插槽数组,让K,其中每个插槽包含包含间隔的索引。

然后

switch (K[B])
{
case 1: // [B1,B2)
...
}