码迷,mamicode.com
首页 > 编程语言 > 详细

测试c语言函数调用性能因素之测试二

时间:2015-08-07 19:00:50      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

函数调用:即调用函数调用被调用函数,调用函数压栈,被调用函数执行,调用函数出栈,调用函数继续执行的一个看似简单的过程,系统底层却做了大量操作。

操作:

1,               调用函数帧指针(函数参数,局部变量,栈帧状态值,函数返回地址)入栈,栈指针自减

2,               保存调用函数的状态数据入寄存器

3,               被调用函数帧指针入栈,执行当前的被调用函数

4,               被调用函数执行结束,退栈,返回到调用函数的帧指针,从寄存器中恢复当时状态数据

5,               继续执行调用函数,直至结束

即整个调用操作有一个压栈出栈,保存和恢复状态数据的过程。而系统栈内存是有默认的固有大小。有多少次函数调用就会分配多少栈帧。故,函数调用性能影响有如下因素:

1,函数递归层数;

2,参数个数(参数签名所占内存大小)

         2.1同类型不同参数个数;

         2.2同参数个数不同参数类型;

         2.3同参数类型同参数个数,但参数类型所占内存大小不同;

3,函数栈大小,即函数局部变量所占栈大小。

为了测试C语言函数调用性能(时间消耗)因素,编写了一个简单程序运行在如下环境中:

  Windows7操作系统上的Vmware虚拟机中的ubuntu系统

在函数调用的开始与结束处,用time.h中的clock()函数返回CPU时钟计时单位数(下表中的starttime和endtime),用durationtime=endtime-starttime表示函数调用的时间消耗。如下:

clock_t  starttime=clock();

函数调用…

clock_t  endtime=clock();

//除以CLOCKS_PER_SEC,得到以秒为单位的时间结果

double durationtime=(double)(endtime-starttime)/CLOCKS_PER_SEC;//表示函数调用占用cpu的时间,不包括子进程或者printf等的操作的时间

 

注:详细讲解clock()函数的网址:http://site.douban.com/199048/widget/notes/12005386/note/253542964/

一.函数递归层数(循环1000000次

 

递归层数

参数个数

函数栈大小(字节

durationtime(秒)[平均值]

每次函数调用平均时间消耗(纳秒)

10

5

1024

0.468

46.8

20

5

1024

0.87

43.5

30

5

1024

1.26

42

50

5

1024

2.39

47.8

100

5

1024

4.778

47.78

500

5

1024

26.394

52.788

1000

5

1024

57.726

57.726

1500

5

1024

93。25

62.167

2000

5

1024

125.75

62.287

3000

5

1024

185.46

61.45

5000

5

1024

322.25

64.45

6000

5

1024

524.49

87.38

7000

5

1024

904.35

129.2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

注:平均每次函数调用时间消耗=durationtime/调用层数/ 循环次数

 

函数调用消耗时间折线图:

技术分享

 

每次函数调用平均时间消耗折线图:

技术分享

 

结论:1,函数时间消耗与函数调用层数几乎成对等倍数增长;

         2,每次函数调用平均时间消耗随着调用层数的增长而有所增长

 

 

二.参数个数(循环1000000次)

 

递归层数

参数个数

函数栈大小(字节)

durationtime(秒)[平均值]

每次函数调用平均时间消耗(纳秒)

1000

1

1024

55.19

55.19

1000

3

1024

54.093

54.093

1000

5

1024

57.603

57.603

1000

10

1024

57.4567

57.4567

 

 

 

 

 

 

 

 

 

注:平均每次函数调用时间消耗=durationtime/调用层数/ 循环次数

 

函数调用消耗时间折线图:

技术分享

每次函数调用平均时间消耗折线图:如上图,只是时间消耗单位改为纳秒

 

 

 

三.函数栈大小

 

递归层数

参数个数

函数栈大(字节)

durationtime(秒)[平均值]

每次函数调用平均时间消耗(纳秒)

1000

5

16

5.8267

 5.8267

1000

5

32

7.035 

 7.035

1000

5

64

13.453 

 13.453

1000

5

128

16.163 

 16.163

1000

5

256

24.063 

 24.063

1000

5

512

40.355 

 40.355

1000

5

1024

57.603 

 57.603

1000

5

2048

88.553 

 88.553

1000

5

3072

 

 

1000

5

4096

 

 

 

测试c语言函数调用性能因素之测试二

标签:

原文地址:http://www.cnblogs.com/woshare/p/4711418.html

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