标签:
函数调用:即调用函数调用被调用函数,调用函数压栈,被调用函数执行,调用函数出栈,调用函数继续执行的一个看似简单的过程,系统底层却做了大量操作。
操作:
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 |
|
|
标签:
原文地址:http://www.cnblogs.com/woshare/p/4711418.html