如何编写包装函数以便编译器有效地优化它?

时间:2017-04-06 12:37:42

标签: c optimization code-generation

我有一个函数在返回链接列表的下一个节点之前进行基本错误检查:

Node *next_node(Node *n) {
  switch(type(n)){
    case A:
    case B:
.
.
    case N:
      return n->next;
    default:
      exit(1); //This is just a representation of my code handling error scenario.
  }
}

它上面有更多的包装器函数,根据上述函数的返回值执行某些操作。

这些包装函数在我的整个代码库中被广泛使用。当我运行探查器时,我发现它们是耗时的例程。 这对我来说很有意义,因为从不同的代码区到这些函数有数千个函数调用,并且由于函数调用过头和/或指令高速缓存未命中,这样的调用数肯定会花费时间。

我也知道编译器会围绕这些进行一些优化,以便在生成汇编代码时可以对它们进行内联。由于目前的实施方式,它似乎无法正常工作。

所以,我的问题是:

  1. 编写这样的包装函数的常用方法是什么,以便编译器可以针对低运行时优化它们?
  2. 其他公司如何在其代码库中处理这种情况?
  3. 注意1:上面的代码只是用于表示,整个代码库中有很多这样的包装函数。因此,如果由于包装函数有人对改进运行时问题有任何想法,应该分享这个想法。

    注2:我使用gcc作为编译器,我的代码库完全在C中。

1 个答案:

答案 0 :(得分:1)

因此,您似乎处于低级优化的正确情况,因为您已经分析了代码并发现了耗时的功能。

假设您已经使用了编译器的更高优化级别,那么不好的部分是对这样的问题没有一般答案。我只能在这里给你一些提示:

  • 某处是多余的操作?如果是,你可以尝试确保你只做一次
  • 是否有可以解开的复杂循环?没有太大的收获,但一些测试代价更长的代码
  • 汇编代码是一个选项吗?如果是,您可以尝试用汇编语言编写全部或部分函数

但你可以(应该?)也想知道:

  • 您的应用程序的一般结构是正确的 - 如果您可以设法减少调用该功能,您花费更少的时间...
  • 你真的需要在生产代码中进行测试。如果它们的断言多于测试,则它们应仅在测试和调试版本中有条件地包含#ifdef