标签:
候老师在课程中提到,在编写代码的时候尽量使用inline函数。想必inline函数在执行效率上应该是非常快的。那么到底有多少提升呢?下面就来测试一下。
首先,编写了两个函数,一个Add1(inline 函数),另一个Add2(非inline函数),代码如下:
Demo.h
#ifndef __DEMO_H__ #define __DEMO_H__ extern inline void Add1(unsigned long& total, unsigned long num) { num %= 10000; total %= 10000; total += num; } extern void Add2(unsigned long& total, unsigned long num); #endifDemo.cpp
#include "Demo.h" void Add2(unsigned long& total, unsigned long num) { num %= 10000; total %= 10000; total += num; }
在Add1和Add2中做了一些操作,模拟函数调用过程,Add1函数比较简单,想必编译器有能力使其成为内联函数。
接下来,编写测试程序,代码如下:
main.cpp
#include "Demo.h" #include <iostream> int main() { unsigned long num = 300000000; //调用inline函数 time_t tb1 = clock(); unsigned long total1 = 0; for (unsigned long i = 0; i < num; ++i) { Add1(total1, i); } time_t te1 = clock(); std::cout<<"Time:"<<te1 - tb1<<std::endl; //调用非inline函数 time_t tb2 = clock(); unsigned long total2 = 0; for (unsigned long i = 0; i < num; ++i) { Add2(total2, i); } time_t te2 = clock(); std::cout<<"Time:"<<te2 - tb2<<std::endl; return 0; }
在这里为了突出测试结果,将循环测试改成300000000;
接下来编译程序,编写Makefile文件,内容如下:
CC = g++ CFLAGS = -DDEBUG -O0 -c .PHONY: all clean all: demo demo: main.o Demo.o $(CC) -O0 -o demo main.o Demo.o main.o: main.cpp $(CC) $(CFLAGS) main.cpp Demo.o: Demo.cpp $(CC) $(CFLAGS) Demo.cpp clean: @echo ------ Delete files ... ------ rm *.o demo.exe
为了更准备的显示测试结果,这里使用 -O0编译器选项,将编译器优化关闭。
最后,开始测试。
$ make clean ------ Delete files ... ------ rm *.o demo.exe Administrator@PC201603031619 /cygdrive/c/Demo $ make g++ -DDEBUG -O0 -c main.cpp g++ -DDEBUG -O0 -c Demo.cpp g++ -O0 -o demo main.o Demo.o Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:2527 Time:2371 Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:2511 Time:2356 Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:2511 Time:2340 Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:2511 Time:2356 Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:2511 Time:2356
嗯?怎么回事?结果竟然恰恰相反,内联函数的执行时间还要长一些。
难道是关闭了编译器优化造成的?
说试就试,将编译器优化打开。修改Makefile文件,将 -O0 改为-O2,重新编译运行。
Administrator@PC201603031619 /cygdrive/c/Demo $ make clean ------ Delete files ... ------ rm *.o demo.exe Administrator@PC201603031619 /cygdrive/c/Demo $ make g++ -DDEBUG -O2 -c main.cpp g++ -DDEBUG -O2 -c Demo.cpp g++ -O0 -o demo main.o Demo.o Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:0 Time:1528 Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:0 Time:1513 Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:0 Time:1528 Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:0 Time:1466 Administrator@PC201603031619 /cygdrive/c/Demo $ ./demo.exe Time:0 Time:1513
至此,这个小实验终于完成了。我们看到内联函数在执行效率上是非常的快。
我这里就抛砖引玉。欢迎大家提出本次实验问题,继续深入探讨。
标签:
原文地址:http://blog.csdn.net/illidanee/article/details/51351752