全局变量和局部变量的性能问题

P_T_P 2010-07-16 11:28:57
测试程序:该测试程序分别调用相同的函数1000000次,但两种调用不同的是前一种传入局部变量,后一种传入全局变量。分别统计了两种调用的时间消耗,精确到微妙。
环境:redhat 2.6.18-53.el5
[dhcp2@dhcp_host lcm]$ vi t8.cpp

1 #include <stdio.h>
2 #include <sys/time.h>
3 int j;
4 void f(int i)
5 {}
6 int main()
7 {
8 int i;
9 struct timeval tv1,tv2;
10 gettimeofday(&tv1,NULL);
11 for(i=0;i<10000000;i++)
12 {
13 f(i);
14 }
15 gettimeofday(&tv2,NULL);
16 printf("usec=%u\n",(tv2.tv_sec-tv1.tv_sec)*1000000+(tv2.tv_usec-tv1.tv_usec));
17 gettimeofday(&tv1,NULL);
18 for(j=0;j<10000000;j++)
19 {
20 f(j);
21 }
22 gettimeofday(&tv2,NULL);
23 printf("usec=%u\n",(tv2.tv_sec-tv1.tv_sec)*1000000+(tv2.tv_usec-tv1.tv_usec));
24 return 0;
25 }

"t8.cpp" 27L, 505C 已写入
[dhcp2@dhcp_host lcm]$ g++ t8.cpp
[dhcp2@dhcp_host lcm]$ ./a.out
usec=46303
usec=52991
[dhcp2@dhcp_host lcm]$ ./a.out
usec=46418
usec=52901
[dhcp2@dhcp_host lcm]$ ./a.out
usec=46384
usec=52942
[dhcp2@dhcp_host lcm]$

从运行结果可以看出,全局变量的调用效率低于局部变量。

实在想不出原因,望高人指点
...全文
713 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Defonds 2010-07-21
  • 打赏
  • 举报
回复
都是牛人哈
zenny_chen 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 magic7004 的回复:]

楼主干嘛在乎几个微妙呢...省下研究这个的时间多少个微妙都回来了。
[/Quote]
乃根本就没资格研究高性能计算领域,鉴定完毕……
zenny_chen 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wjb_yd 的回复:]

如果非要找个理由解释的话,应该是栈上的内存在可执行文件加载时就已经提交了一部分了。
而全局变量所在内存地址加载时未提交,会引发一次页面调度。
不知道对不对,愚见了...
[/Quote]
缺页情况确实可能会发生,但是对于大规模次循环执行而言,其充其量就几个微秒。而从数据上比较下来是有比较大的常数差距的,呵呵呵……

其实楼主应该贴一下反汇编代码,这样能看出问题。
偶认为

for(i=0;i<10000000;i++)
{
f(i);
}

这段代码中,i自增不需要写会存储器,因为局部变量完全可以通过寄存器直接存放;
而j由于是全局变量,因此每次做j++后,需要把加1后的值显式地写回j。由于一直对同一地址操作,所以必定被Cache,因此增加额外的指令与指令总数之比(大约1:5),存在20%左右的性能差距也是很正常的,呵呵。
MagiSu 2010-07-21
  • 打赏
  • 举报
回复
1、你不打开-O2或者-O3,比较性能就没有意义。
2、你的局部变量肯定已经被优化到寄存器里面了,但是全局变量很可能必须保存在内存的某个位置。
magic7004 2010-07-19
  • 打赏
  • 举报
回复
楼主干嘛在乎几个微妙呢...省下研究这个的时间多少个微妙都回来了。
wjb_yd 2010-07-19
  • 打赏
  • 举报
回复
如果非要找个理由解释的话,应该是栈上的内存在可执行文件加载时就已经提交了一部分了。
而全局变量所在内存地址加载时未提交,会引发一次页面调度。
不知道对不对,愚见了...
zenny_chen 2010-07-16
  • 打赏
  • 举报
回复
呵呵,你就这么点局部变量都可以进寄存器了。
这个没的比……
lwenjie 2010-07-16
  • 打赏
  • 举报
回复
这个能卖钱吗
healer_kx 2010-07-16
  • 打赏
  • 举报
回复
天哪,现在都在研究什么了~不了解。。。
jiuchang 2010-07-16
  • 打赏
  • 举报
回复
全局变量和局部变量放在内存的不同地方,存取费时间吧
we_sky2008 2010-07-16
  • 打赏
  • 举报
回复
局部变量在栈空间,访问速度比较快
PG 2010-07-16
  • 打赏
  • 举报
回复
- - !!!!
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
pengzhixi 2010-07-16
  • 打赏
  • 举报
回复
没看出来,都是传值的
mochhk 2010-07-16
  • 打赏
  • 举报
回复
都答了就支持一下吧~~
yuxiabo1984 2010-07-16
  • 打赏
  • 举报
回复
局部变量在栈上,cpu访问效率高。
赵4老师 2010-07-16
  • 打赏
  • 举报
回复
CPU Cache
知道不?
ypb362148418 2010-07-16
  • 打赏
  • 举报
回复
变量太少,没得比。

看看C++ 内存管理吧,好好看看各个不同变量是在哪个区申请内存的,就知道了

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧