performance - 访问全局数据是否比访问本地数据更快?
问题描述
问题更多是关于 DRAM 的工作原理。
(用 C 术语讲)如果我有一个本地(位于堆栈上)变量和一个全局(静态或动态分配)变量,哪一个会访问得更快?考虑到两者都没有被缓存或放在寄存器中!
所以实际的问题是检索靠近先前触摸区域的数据是否比检索完全不同位置的数据更快,例如行地址和列地址与以前不同。
如果访问时间确实存在差异,为什么?
解决方案
一般没有区别。无论给定地址是在堆栈上还是堆上,DRAM 的工作原理都是一样的。在实践中,有几种情况局部变量通常更快:
- 堆栈的前几个字节实际上总是在缓存中,第一次访问静态变量时,它可能不会。
- 编译器通常可以静态分析局部变量的生命周期并将其优化到寄存器中,从而完全消除内存访问,而全局变量通常必须加载和存储,因为程序的另一部分可能已经更改过它并且可以引用稍后。
- 在许多架构上,访问相对于堆栈指针的内存位置的机器指令比访问任意静态地址的机器指令更有效。
使事情复杂化的是,“本地/全球”可能不是你真正想要的区别。例如,许多语言都有像全局变量一样实现的“静态局部”变量,但在词法上是局部的,而在词法上是非局部的但存储在堆栈上的“线程局部”变量。如果你在调用链的下游通过引用传递一个本地分配的变量,它最终会从缓存中掉出来,表现得和全局一样。
推荐阅读
- python - Numpy如何用另一个向量分配矩阵列的值?
- excel - 将同一列中的单元格值与 Excel 中的其他条件进行比较
- android - 找到多个文件,其独立于操作系统的路径 'META-INF/androidx.legacy_legacy-support-core-utils.version' (java)
- html - 在一行CSS中放置一个带圆圈的矩形
- vue.js - Vuex mapActions:映射器参数必须是数组或对象
- angular - ASP.NET Core + Angular 使用 Azure DevOps 发布管道部署工件
- gulp - 错误:src 路径的 glob 参数无效,用作变量
- haskell - 为什么 Monoidal 和 Applicative 定律告诉我们同样的事情?
- java - 如何在不同时区的某个时间执行作业
- mysql - 坚持基于三个表获取行