标签:
候老师在课程中提到,在编写代码的时候尽量使用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