首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免循环中的条件和函数调用

避免循环中的条件和函数调用
EN

Stack Overflow用户
提问于 2013-07-12 10:01:09
回答 7查看 973关注 0票数 5

我有这样的代码:

代码语言:javascript
复制
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);
      ...
    }
  }
}

其思想是,根据参数的不同,我想将一些数学表达式应用于ab。这个函数被执行了很多次,而且必须是快速的,我想知道在每次迭代中这些条件分支是否可以引入我可以节省的开销。

现在,我写了这样的代码:

代码语言:javascript
复制
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也被多次调用(分支预测在调用之间“存活”了吗?)

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-07-12 10:33:03

您可以将函数转换为模板:

代码语言:javascript
复制
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);
      ...
    }
  }
}

因为条件总是真或假,编译器将优化条件树,只留下真正的数学表达式。没有分支和函数调用!

现在,您只能通过常量参数使用它:

代码语言:javascript
复制
functionT<1>();

但不包括变量:

代码语言:javascript
复制
int x = 1;
functionT<x>(); //Error

如果你需要,你可以做一个包装:

代码语言:javascript
复制
void function(int parameter)
{
    switch (parameter)
    {
        case 1: functionT<1>(); break;
        case 2: functionT<2>(); break;
    }
}
票数 5
EN

Stack Overflow用户

发布于 2013-07-12 10:11:33

别担心。现代CPU的有分支预测器,它们将正确地预测所采取的分支。

票数 3
EN

Stack Overflow用户

发布于 2013-07-12 10:11:13

您可以设置函数指针的常量数组,并调用与parameter关联的函数。

但是,如果数学表达式相当小,则switch()语句可能会更快。

代码语言:javascript
复制
switch (parameter) {
    case 1:
        value = math expression 1;
        break;
    case 2:
        ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17612337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档