2017-04-06 79 views
0

我有做基本的错误返回链接列表的下一个节点之前检查功能:如何编写包装函数以便编译器有效地优化它?

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.

+1

你是否启用了优化启用('-O3')的gcc? – silel

回答

1

所以,你似乎是在正确的情况下,低级别的优化,因为你已经异形你的代码,发现了耗时功能。

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

  • 是一些冗余操作的地方?如果是的话,你可以尝试确保你只做一次
  • 是否有复杂的循环可以展开?没有太大的收获,但一些测试代价更大的代码
  • 是汇编代码的一个选项?如果是的话,你可以尝试写功能的全部或部分用汇编语言

但你也可以(应该?)不知道是否:

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