免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2865 | 回复: 8
打印 上一主题 下一主题

全局变量和局部变量的性能问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-15 17:15 |只看该作者 |倒序浏览
测试程序:该测试程序分别调用相同的函数1000000次,但两种调用不同的是前一种传入局部变量,后一种传入全局变量。分别统计了两种调用的时间消耗,精确到微妙。

[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]$

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

实在想不出原因,望高人指点

论坛徽章:
0
2 [报告]
发表于 2010-07-15 18:02 |只看该作者
你想一想它们存储的位置,也许你就明白了.

论坛徽章:
0
3 [报告]
发表于 2010-07-15 18:33 |只看该作者
本帖最后由 kgn28 于 2010-07-15 18:37 编辑

回复 1# q_T_p


    我的运行结果:
usec=51240
usec=44582

你的程序,我一点都没改,所以和变量的位置无关,别说不是指针了(传值调用。。。),就算是,因为是VM,也不会有什么区别的。这个时间的区别应该是计时器的问题。

反过来,就是你的tv1和tv2调过来(i j的调用换一下位置):
usec=51120
usec=59712

usec=47163
usec=51047

usec=45929
usec=51263

usec=47163
usec=51487

在换回来:
usec=51731
usec=44611

usec=51476
usec=69179

usec=51033
usec=44478

论坛徽章:
0
4 [报告]
发表于 2010-07-16 11:11 |只看该作者
回复 3# kgn28


我忘了说明环境:操作系统是redhat linux  2.6.18-53.el5
我把两个调用循环的代码调换了位置,但结论是一致的
代码:
  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(j=0;j<10000000;j++)
  12.         {
  13.                 f(j);
  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(i=0;i<10000000;i++)
  19.         {
  20.                 f(i);
  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. }
复制代码
结果是:
[dhcp2@dhcp_host lcm]$ ./a.out
usec=52885
usec=46253
[dhcp2@dhcp_host lcm]$ ./a.out
usec=52908
usec=46301
[dhcp2@dhcp_host lcm]$ ./a.out
usec=53154
usec=46295
[dhcp2@dhcp_host lcm]$ ./a.out
usec=52858
usec=46278

不知道,这位大哥什么环境下运行才测试程序。如果我们环境不一样的话,说明这和环境有关系。

论坛徽章:
0
5 [报告]
发表于 2010-07-16 11:16 |只看该作者
回复 4# q_T_p


    你运行至少100次,看看结果.

论坛徽章:
0
6 [报告]
发表于 2010-07-16 11:23 |只看该作者
回复 5# samlumengjun


    结论一样

论坛徽章:
0
7 [报告]
发表于 2010-07-16 11:25 |只看该作者
回复 2# rlingxing


    就是想过存储位置,所以越想越不明白

论坛徽章:
0
8 [报告]
发表于 2010-07-16 11:36 |只看该作者
同盼,坐等高人

论坛徽章:
0
9 [报告]
发表于 2010-07-16 13:16 |只看该作者
本帖最后由 kgn28 于 2010-07-16 13:27 编辑
  1. 67 .L8:
  2. 68         movl    j(%rip), %edi
  3. 69         call    f
  4. 70         movl    j(%rip), %eax
  5. 71         addl    $1, %eax
  6. 72         movl    %eax, j(%rip)
  7. 73 .L7:
  8. 74         movl    j(%rip), %eax
  9. 75         cmpl    $9999999, %eax
  10. 76         jle     .L8
复制代码
  1. 37 .L5:
  2. 38         movl    -20(%rbp), %edi
  3. 39         call    f
  4. 40         addl    $1, -20(%rbp)
  5. 41 .L4:
  6. 42         cmpl    $9999999, -20(%rbp)
  7. 43         jle     .L5
复制代码
没看出有什么大的区别,只不过上面的多了一句“movl    %eax, j(%rip)”,也就是说要把全局变量的值改变,然后存回去。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP