我有这样的代码:
void function(int parameter)
{
for( ... ) // a big loop
{
double a = ...;
for( ... ) // a big loop
{
double b = ...;
double value;
if(parameter == 1)
value = some_math_expression_1(a, b);
else if(parameter == 2)
value = some_math_expression_2(a, b);
...
}
}
}其思想是,根据参数的不同,我想将一些数学表达式应用于a和b。这个函数被执行了很多次,而且必须是快速的,我想知道在每次迭代中这些条件分支是否可以引入我可以节省的开销。
现在,我写了这样的代码:
void function(int parameter)
{
if(parameter == 1)
function1();
else if(parameter == 2)
function2();
else
...
}这样,如果在每个functionX()中重复代码,我就可以直接应用数学表达式。很明显的问题是,当我想要修改一些代码时,我必须做几次(我现在有大约10个数学表达式)。
我可以使用什么方法来避免function中的任何开销?
如果我将指向函数some_math_expression_X的指针传递给function (我将更改函数调用的条件)怎么办?
如果我将整个函数编码为宏(uf)并将数学表达式设置为参数,该怎么办?
如果我使用一个模板并将数学表达式作为指向内联函数的指针传递(这是否可能)呢?
编辑:谢谢你的回答。我知道我可以使用您提议的方法(指向/数组函数的指针,或依赖分支预测器)。但是,您对避免开销有什么更好的见解吗?数学表达式非常简单(类似于a*b),除了长的循环之外,function也被多次调用(分支预测在调用之间“存活”了吗?)
发布于 2013-07-12 10:33:03
您可以将函数转换为模板:
void functionT<int PARAMETER>()
{
for( ... ) // a big loop
{
double a = ...;
for( ... ) // a big loop
{
double b = ...;
double value;
if(PARAMETER == 1) //Constant condition!!!
value = some_math_expression_1(a, b);
else if(PARAMETER == 2) //Constant condition!!!
value = some_math_expression_2(a, b);
...
}
}
}因为条件总是真或假,编译器将优化条件树,只留下真正的数学表达式。没有分支和函数调用!
现在,您只能通过常量参数使用它:
functionT<1>();但不包括变量:
int x = 1;
functionT<x>(); //Error如果你需要,你可以做一个包装:
void function(int parameter)
{
switch (parameter)
{
case 1: functionT<1>(); break;
case 2: functionT<2>(); break;
}
}发布于 2013-07-12 10:11:33
别担心。现代CPU的有分支预测器,它们将正确地预测所采取的分支。
发布于 2013-07-12 10:11:13
您可以设置函数指针的常量数组,并调用与parameter关联的函数。
但是,如果数学表达式相当小,则switch()语句可能会更快。
switch (parameter) {
case 1:
value = math expression 1;
break;
case 2:
...
}https://stackoverflow.com/questions/17612337
复制相似问题