【问题标题】:How to write wrapper function so that compiler efficiently optimize it?如何编写包装函数以便编译器有效地优化它?
【发布时间】:2017-04-06 12:37:41
【问题描述】:

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

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. 其他公司如何在其代码库中处理这种情况?

注意1:上面的代码只是为了表示,整个代码库中有很多这样的包装函数。因此,如果有人对由于包装函数而改进运行时问题有任何想法,应该分享这个想法。

注意 2:我使用 gcc 作为编译器,我的代码库完全是 C 语言。

【问题讨论】:

  • 您是否在启用优化的情况下运行 gcc (-O3)?

标签: c optimization code-generation


【解决方案1】:

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

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

  • 某处是否有一些冗余操作?如果是,您可以尝试确保只执行一次
  • 是否存在可以展开的复杂循环?收获不多,但需要以更长的代码为代价进行一些测试
  • 是否可以选择汇编代码?如果是,您可以尝试用汇编语言编写全部或部分函数

但您可能(应该?)也想知道:

  • 您的应用程序的一般结构是正确的 - 如果您可以设法减少调用函数的次数,那么您在其中花费的时间就会减少...
  • 您确实需要在生产代码中进行测试。如果它们是断言而不是测试,则它们只能有条件地包含在测试和调试版本中的 #ifdef 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2016-02-14
    相关资源
    最近更新 更多