cache line对内存访问的影响
cache line对内存访问的影响很早就看到了,但是没有写过例子跑过,突然兴起就写了下,对这里第一个例子稍微做了改造。要注意jvm参数设置,新生代+老生代分配了2.4xG内存,新生代分了2G,eden区分了1.6g,从实际内存占用看,数组eden区使用了近1.1G的内存,剩下区域基本都是空的。另,demo是在mac上跑的。
/*** -Xms2500m -Xmx2500m -Xcomp -Xmn2g -XX:NewRatio=10* @author tianmai.fh* @date 2014-03-12 16:55*/
public class CacheLineTest {public static final int COUNT = 3;public static void main(String[] args) {int[] arrs = new int[64 * 1024 * 1024 * 4]; //1g的空间,通过参数设值全放到了eden取,避免gc对测试结果的影响equivalentWidth(arrs);fullLoop(arrs);}/*** 全循环,看跨cache line和不跨cache line的时候,花费时间对比* @param arrs*/public static void fullLoop(int[] arrs){int forLen = 256;int forAssembly = 0;while (forAssembly++ < COUNT) { // 循环三次,避免第一次代码优化前的影响for (int i = 1; i <= forLen; i *= 2) {long start = System.currentTimeMillis();for (int j = 0, size = arrs.length; j < size; j += i) {arrs[j] = j * 3;}long end = System.currentTimeMillis();System.out.println("Full, factor: " + i + " spent " + (end - start) + " ms");}System.out.println();}}/*** 每次循环计算次数相同,比较跨cache line和不跨cache line的时候,花费时间的差异* @param arrs*/public static void equivalentWidth(int[] arrs){int forLen = 256;int breakWidth = arrs.length / 256;int forAssembly = 0;while (forAssembly++ < COUNT) { // 循环三次,避免第一次代码优化前的影响for (int i = 1; i <= forLen; i *= 2) {long start = System.currentTimeMillis();int cnt = 0;for (int j = 0, size = arrs.length; j < size; j += i) {arrs[j] = j;if (++cnt > breakWidth) { //每次循环就access这么多数据break;}}long end = System.currentTimeMillis();System.out.println("Equivalent Witdh, factor: " + i + " spent " + (end - start) + " ms");}System.out.println();}}
}
结果,等量数据访问的情况:
Equivalent Witdh, factor: 1 spent 3 ms
Equivalent Witdh, factor: 2 spent 7 ms
Equivalent Witdh, factor: 4 spent 2 ms
Equivalent Witdh, factor: 8 spent 3 ms
Equivalent Witdh, factor: 16 spent 7 ms
Equivalent Witdh, factor: 32 spent 10 ms
Equivalent Witdh, factor: 64 spent 10 ms
Equivalent Witdh, factor: 128 spent 8 ms
Equivalent Witdh, factor: 256 spent 9 msEquivalent Witdh, factor: 1 spent 1 ms
Equivalent Witdh, factor: 2 spent 1 ms
Equivalent Witdh, factor: 4 spent 2 ms
Equivalent Witdh, factor: 8 spent 4 ms
Equivalent Witdh, factor: 16 spent 7 ms
Equivalent Witdh, factor: 32 spent 10 ms
Equivalent Witdh, factor: 64 spent 10 ms
Equivalent Witdh, factor: 128 spent 9 ms
Equivalent Witdh, factor: 256 spent 8 msEquivalent Witdh, factor: 1 spent 2 ms
Equivalent Witdh, factor: 2 spent 1 ms
Equivalent Witdh, factor: 4 spent 1 ms
Equivalent Witdh, factor: 8 spent 4 ms
Equivalent Witdh, factor: 16 spent 7 ms
Equivalent Witdh, factor: 32 spent 9 ms
Equivalent Witdh, factor: 64 spent 10 ms
Equivalent Witdh, factor: 128 spent 9 ms
Equivalent Witdh, factor: 256 spent 8 ms
观察会发现,第二次和第三次运行,步长在1-8的时候,时间消耗是一个量级,大于等于16的时候,就是更高的量级了。
访问全部可访问数据的情况:
Full, factor: 1 spent 351 ms
Full, factor: 2 spent 178 ms
Full, factor: 4 spent 113 ms
Full, factor: 8 spent 111 ms
Full, factor: 16 spent 113 ms
Full, factor: 32 spent 77 ms
Full, factor: 64 spent 40 ms
Full, factor: 128 spent 17 ms
Full, factor: 256 spent 9 msFull, factor: 1 spent 351 ms
Full, factor: 2 spent 180 ms
Full, factor: 4 spent 113 ms
Full, factor: 8 spent 114 ms
Full, factor: 16 spent 111 ms
Full, factor: 32 spent 74 ms
Full, factor: 64 spent 40 ms
Full, factor: 128 spent 16 ms
Full, factor: 256 spent 9 msFull, factor: 1 spent 355 ms
Full, factor: 2 spent 178 ms
Full, factor: 4 spent 112 ms
Full, factor: 8 spent 111 ms
Full, factor: 16 spent 113 ms
Full, factor: 32 spent 76 ms
Full, factor: 64 spent 40 ms
Full, factor: 128 spent 17 ms
Full, factor: 256 spent 8 ms
这个在步长为1的时候耗时比较多,2-8的时候是一个量级的。在大于8的时候,耗时基本上是以50%的比率在递减,随着步长变长,导致的cache line重新加载次数也在递减。
cache line对内存访问的影响相关推荐
- 小师妹学JVM之:cache line对代码性能的影响
文章目录 简介 一个奇怪的现象 两个问题的答案 CPU cache line inc 和 add 总结 简介 读万卷书不如行万里路,讲了这么多assembly和JVM的原理与优化,今天我们来点不一样的 ...
- CPU Cache Line伪共享问题的总结和分析
原文:吴一昊,杨勇 Linux阅码场 地址:CPU Cache Line伪共享问题的总结和分析 Table of Contents 1. 关于本文 2. 背景知识 2.1 存储器层次结构 2.2 多核 ...
- CPU Cache Line:CPU缓存行/缓存块
<CPU Cache Line伪共享问题的总结和分析> 以下文章来源于小林coding ,作者小林coding Table of Contents CPU Cache 有多快? CPU C ...
- Linux内存管理:NUMA技术详解(非一致内存访问架构)
图片来源:https://zhuanlan.zhihu.com/p/68465952 <Linux内存管理:转换后备缓冲区(TLB)原理> <内存管理:Linux Memory Ma ...
- 计算机缓存Cache以及Cache Line详解
转载: 计算机缓存Cache以及Cache Line详解 - 围城的文章 - 知乎 https://zhuanlan.zhihu.com/p/37749443 L1,L2,L3 Cache究竟在哪里? ...
- 7个示例科普CPU Cache line
CPU cache一直是理解计算机体系架构的重要知识点,也是并发编程设计中的技术难点,而且相关参考资料如同过江之鲫,浩瀚繁星,阅之如临深渊,味同嚼蜡,三言两语难以入门.正好网上有人推荐了微软大牛Igo ...
- NUMA全称 Non-Uniform Memory Access,译为“非一致性内存访问”,积极NUMA内存策略
目录 NUMA的诞生背景 NUMA构架细节 上机演示 NUMA Memory Policy What is NUMA Memory Policy? Memory Policy Concepts Sco ...
- cache line大小
我们都知道cache的作用是把主存储器的数据到寄存器的一个缓冲区,被称为高速缓存,其能够大大提高程序的性能,那么cache的性能受cache line size的影响很大.cache line大小到底 ...
- Linux内存耗尽宕机6,转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案...
原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...
最新文章
- python if elif else 区别
- 基于近距离的测距感知传感器调研以及扩展介绍
- D - Fliptile POJ - 3279(翻转问题)
- usaco Mother's Milk
- 错误处理:Syntax error: Bad for loop variable
- Visual C++设计UDP协议通讯示例
- wxWidgets:wxXmlDocument类用法
- win7您需要来自计算机管理员的权限,win7需要提供管理员权限才能打开文件怎么解决...
- 树莓派服务器证书,【原创】在树莓派3上给Nginx部署免费HTTPS证书
- HALCON 21.11:深度学习笔记---术语表(7)
- php7 返回静态类,PHP7 – 未捕获错误:访问未声明的静态属性
- 创业公司的技术总监,去上市公司面试,结果凉了。
- php 数字转换为货币,php中数字转换成货币格式实现代码
- 人人商城小程序 java版_人人商城小程序用户授权问题
- 8大排序算法总结-Python
- 程序猿的24个段子:栈和队列的区别是啥?
- 3D建模学习对于电脑配置要求高不高?显卡内存等全方面解析,小白福音
- 5.9 使用新建调整图层命令调整图像 [原创Ps教程]
- JavaSE 知识大纲
- 探访广东第二鬼城,一座长在石油上的城市
热门文章
- win7笔记本外接显示器html,详解笔记本电脑连接外部显示器的操作流程
- windows 远程 登录无操作30分钟后自动退出登录_【计时优易学车远程教育学习流程】...
- 蓝牙心率检测仪涉及到的主要硬件组成
- 蓝牙协议--HFP协议--转
- mac安装软件允许任何来源(sudo spctl --master-disable)
- 艾美捷重组蛋白酶K,无动物源/AF化学性质介绍
- Android 毕业设计高仿新浪微博客户端(内附源码)
- 全球地名中英文对照表(B)
- Windows下安装使用Spacy英文库en_core_web_md,解决Warning: no model found for 'en_core_web_md'
- Ascent代码分析4-World之地图管理及实现结构