Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303564
  • 博文数量: 35
  • 博客积分: 836
  • 博客等级: 准尉
  • 技术积分: 678
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-07 20:11
文章分类

全部博文(35)

文章存档

2013年(1)

2012年(24)

2011年(10)

分类: C/C++

2012-04-05 20:48:41

好久没有写博客了。上次是因为工作的事打断了……这里不好提工作的事,所以工作中的内容一般不会记录在此。

嗯,今天突然在看代码的时候想了想inline的作用到底有多大呢?

然后写了以下的代码进行了比较:


  1. #include
  2. #include

  3. void normal_func(int *a) 
  4. {
  5.     (*a)++;
  6. }

  7. inline void inline_func(int *a) 
  8. {
  9.     (*a)++;
  10. }

  11. int main()
  12. {
  13.     struct timeval st_time;
  14.     struct timeval ed_time;
  15.     int i = 0;
  16.     int x = 0;

  17.     gettimeofday(&st_time, NULL);
  18.     for (i = 0; i < 100*1000*1000; ++i)
  19.     {   
  20.         normal_func(&x);
  21.     }   
  22.     gettimeofday(&ed_time, NULL);
  23.     printf("x is %d, normal_func used %lu us.\n", x, 1000000 * (ed_time.tv_sec - st_time.tv_sec) + (ed_time.tv_usec - st_time.tv_usec));

  24.     x = 0;
  25.     gettimeofday(&st_time, NULL);
  26.     for (i = 0; i < 100*1000*1000; ++i)
  27.     {   
  28.         inline_func(&x);
  29.     }   
  30.     gettimeofday(&ed_time, NULL);
  31.     printf("x is %d, inline_func used %lu us.\n", x, 1000000 * (ed_time.tv_sec - st_time.tv_sec) + (ed_time.tv_usec - st_time.tv_usec));

  32.     return 0;
  33. }
一段简单到不能再简单的代码了,OK编译

  1. gcc -g cmp.c
执行:

  1. x is 100000000, normal_func used 359159 us.
  2. x is 100000000, inline_func used 359133 us.
我勒个去没有效果,重新编译:

  1. gcc --inline-function -g cmp.c
再执行一遍

  1. x is 100000000, normal_func used 358731 us.
  2. x is 100000000, inline_func used 271571 us.
这回还差不多。

看来我这个机器编译代码写的不算得在编译选项中加入--inline-function才是真的。

从上面的小实验中,这个inline的作用还是比较明显的,在经常执行的函数中,比如排序比较函数中经常使用的函数之类最好还是能够使用inline,并在在编译选项中强制加入--inline-function才会生效。

嗯,接下来再试试-O1选项:

  1. gcc --inline-function -g -O1 cmp.c
执行下看看效果

  1. x is 100000000, normal_func used 276558 us.
  2. x is 100000000, inline_func used 79040 us.
嗯,inline的效果更明显了。

不过将优化开到-O3的时候:

  1. gcc --inline-function -g -O3 cmp.c
执行看看:

  1. x is 100000000, normal_func used 78995 us.
  2. x is 100000000, inline_func used 78990 us.
擦,内联效果全都没了,看来编译器给那个自动内联了。

对于为啥,我现在也无法完全解释清楚,总的说来inline确实能够提升程序运行的速度。编译器怎么优化呢,我更加不清楚了,有机会的话,后面可以多了解下。
阅读(2775) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~