码迷,mamicode.com
首页 > 其他好文 > 详细

(GeekBand或极客班) inline 函数的思考。

时间:2016-05-12 22:12:47      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

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

#endif
Demo.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

哇!这里看到内联函数几乎瞬间执行完成。


至此,这个小实验终于完成了。我们看到内联函数在执行效率上是非常的快。


我这里就抛砖引玉。欢迎大家提出本次实验问题,继续深入探讨。




(GeekBand或极客班) inline 函数的思考。

标签:

原文地址:http://blog.csdn.net/illidanee/article/details/51351752

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!