好久没有写博客了。上次是因为工作的事打断了……这里不好提工作的事,所以工作中的内容一般不会记录在此。
嗯,今天突然在看代码的时候想了想inline的作用到底有多大呢?
然后写了以下的代码进行了比较:
- #include
- #include
- void normal_func(int *a)
- {
- (*a)++;
- }
- inline void inline_func(int *a)
- {
- (*a)++;
- }
- int main()
- {
- struct timeval st_time;
- struct timeval ed_time;
- int i = 0;
- int x = 0;
- gettimeofday(&st_time, NULL);
- for (i = 0; i < 100*1000*1000; ++i)
- {
- normal_func(&x);
- }
- gettimeofday(&ed_time, NULL);
- 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));
- x = 0;
- gettimeofday(&st_time, NULL);
- for (i = 0; i < 100*1000*1000; ++i)
- {
- inline_func(&x);
- }
- gettimeofday(&ed_time, NULL);
- 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));
- return 0;
- }
一段简单到不能再简单的代码了,OK编译
- x is 100000000, normal_func used 359159 us.
- x is 100000000, inline_func used 359133 us.
我勒个去没有效果,重新编译:
- gcc --inline-function -g cmp.c
再执行一遍
- x is 100000000, normal_func used 358731 us.
- x is 100000000, inline_func used 271571 us.
这回还差不多。
看来我这个机器编译代码写的不算得在编译选项中加入--inline-function才是真的。
从上面的小实验中,这个inline的作用还是比较明显的,在经常执行的函数中,比如排序比较函数中经常使用的函数之类最好还是能够使用inline,并在在编译选项中强制加入--inline-function才会生效。
嗯,接下来再试试-O1选项:
- gcc --inline-function -g -O1 cmp.c
执行下看看效果
- x is 100000000, normal_func used 276558 us.
- x is 100000000, inline_func used 79040 us.
嗯,inline的效果更明显了。
不过将优化开到-O3的时候:
- gcc --inline-function -g -O3 cmp.c
执行看看:
- x is 100000000, normal_func used 78995 us.
- x is 100000000, inline_func used 78990 us.
擦,内联效果全都没了,看来编译器给那个自动内联了。
对于为啥,我现在也无法完全解释清楚,总的说来inline确实能够提升程序运行的速度。编译器怎么优化呢,我更加不清楚了,有机会的话,后面可以多了解下。
阅读(2775) | 评论(0) | 转发(0) |