全局变量和局部变量

全局变量和局部变量在性能上有显著差异,局部变量的执行速度大约是全局变量的5.02倍。这是因为全局变量通过getfield从堆中获取,而局部变量直接从栈中出栈获取,栈操作更快。全局变量在未指定初值时默认为0,同一源文件中全局变量在局部作用域内无效。使用局部变量可以避免CPU缓存带来的不确定性,提高程序性能。优化代码时,推荐优先使用局部变量。
摘要由CSDN通过智能技术生成

在工作的时候,发现有很多细节不注意,会出现各种奇奇怪怪的问题,今天分享全局变量和局部变量的区别,一直觉得自己很清楚两者的不同,不查不知道,一查发现自己还有很多的盲区,知道越多,越觉得自己了解越少,一定要多向前辈们学习才是啊,在此向各位一直在路上的前辈们致敬。
全局变量和局部变量的区别:
1、局部变量的性能比全局变量的性能快了大约 5.02 倍;使用全局变量会用 getfield 关键字从堆中获取变量,而局部变量则是通过出栈来获取变量的,因为出栈操作要比堆操作快很多,因此局部变量操作也会比全局变量快很多。
Getfield关键字的语义是从堆上获得变量。
2、定义不同,全局变量定义在函数外,局部变量定义在函数内;
3、有效期不同:全局变量的有效期和主程序一样,可随时访问,程序退出才释放内存;局部变量在函数或者循环内部,在进入函数或者循环时获得内存,仅能由改函数或该循环能够访问,函数结束释放内存并失效;
4、内存存储方式不同:全局变量在全局数据堆上,局部变量在栈区;

注意:
1、 全局变量在不指定初值的情况下自动初始化为0;
2、 在同一源文件中,允许全局变量和局部变量同名,但在局部变量的作用域内,全局变量不起作用。
3、 局部变量也称为内部变量;全局变量也称为外部变量,它属于一个源程序文件。

小彩蛋:
全局变量和局部变量若是性能差不多,是因为全局变量被CPU缓存了,每次我们查询时不会直接从对象的实例域(对象的实际存储结构)中查询的,而是直接从 CPU 的缓存中查询的。
用volatile关键字来修饰全局变量,这样CPU就不会缓存此变量了。volatile 原本的语义是禁用 CPU 缓存的。

实验证明:局部变量的性能比全局变量的性能快了大约 5.02 倍。
为什么呢?
解答:使用全局变量会用 getfield 关键字从堆中获取变量,而局部变量则是通过出栈来获取变量的,因为出栈操作要比堆操作快很多,因此局部变量操作也会比全局变量快很多。
Getfield关键字的语义是从堆上获得变量。

关于缓存:
在计算机系统中,CPU 缓存(CPU Cache)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于 CPU 寄存器,如下图所示:
在这里插入图片描述
CPU 缓存的容量远小于内存,但速度却可以接近处理器的频率。当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。
CPU 缓存可以分为一级缓存(L1),二级缓存(L2),部分高端 CPU 还具有三级缓存(L3),这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。当 CPU 要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。
内存的响应速度要比 CPU 缓存慢很多。
在这里插入图片描述
能用局部变量的绝不使用全局变量,因为 CPU 缓存有以下 3 个问题:
CPU Cache 采用的是 LRU 和 Random 的清除算法,不常使用的缓存和随机抽取一部分缓存会被删除掉;
CPU Cache 有缓存命中率的问题,也就是有一定的几率会访问不到缓存;
部分 CPU 只有两级缓存(L1 和 L2),因此可以使用的空间是有限的。
所以一个不稳定的系统硬件堆对程序的执行性能是很不靠谱的。建议能用局部变量绝不用全局变量。

参考文章:
[1]https://mp.weixin.qq.com/s?src=11&timestamp=1610701196&ver=2829&signature=yT0V0KTb-IUkrl476gkkOPO49ftgoPQg8QMPVH4hZSFKks0lAz9hGbM6DfY4t9k5iyY0JtGPv8-GWwfEiMBTv7JKA2sHaszJVdK8ZoOCdCHkhmmEg6SJe6Supxl-aA&new=1
[2] https://jiaoyu.tianqijun.com/pc/doc/49040.html

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大山很山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值