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对内存访问的影响相关推荐

  1. 小师妹学JVM之:cache line对代码性能的影响

    文章目录 简介 一个奇怪的现象 两个问题的答案 CPU cache line inc 和 add 总结 简介 读万卷书不如行万里路,讲了这么多assembly和JVM的原理与优化,今天我们来点不一样的 ...

  2. CPU Cache Line伪共享问题的总结和分析

    原文:吴一昊,杨勇 Linux阅码场 地址:CPU Cache Line伪共享问题的总结和分析 Table of Contents 1. 关于本文 2. 背景知识 2.1 存储器层次结构 2.2 多核 ...

  3. CPU Cache Line:CPU缓存行/缓存块

    <CPU Cache Line伪共享问题的总结和分析> 以下文章来源于小林coding ,作者小林coding Table of Contents CPU Cache 有多快? CPU C ...

  4. Linux内存管理:NUMA技术详解(非一致内存访问架构)

    图片来源:https://zhuanlan.zhihu.com/p/68465952 <Linux内存管理:转换后备缓冲区(TLB)原理> <内存管理:Linux Memory Ma ...

  5. 计算机缓存Cache以及Cache Line详解

    转载: 计算机缓存Cache以及Cache Line详解 - 围城的文章 - 知乎 https://zhuanlan.zhihu.com/p/37749443 L1,L2,L3 Cache究竟在哪里? ...

  6. 7个示例科普CPU Cache line

    CPU cache一直是理解计算机体系架构的重要知识点,也是并发编程设计中的技术难点,而且相关参考资料如同过江之鲫,浩瀚繁星,阅之如临深渊,味同嚼蜡,三言两语难以入门.正好网上有人推荐了微软大牛Igo ...

  7. NUMA全称 Non-Uniform Memory Access,译为“非一致性内存访问”,积极NUMA内存策略

    目录 NUMA的诞生背景 NUMA构架细节 上机演示 NUMA Memory Policy What is NUMA Memory Policy? Memory Policy Concepts Sco ...

  8. cache line大小

    我们都知道cache的作用是把主存储器的数据到寄存器的一个缓冲区,被称为高速缓存,其能够大大提高程序的性能,那么cache的性能受cache line size的影响很大.cache line大小到底 ...

  9. Linux内存耗尽宕机6,转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案...

    原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...

最新文章

  1. python if elif else 区别
  2. 基于近距离的测距感知传感器调研以及扩展介绍
  3. D - Fliptile POJ - 3279(翻转问题)
  4. usaco Mother's Milk
  5. 错误处理:Syntax error: Bad for loop variable
  6. Visual C++设计UDP协议通讯示例
  7. wxWidgets:wxXmlDocument类用法
  8. win7您需要来自计算机管理员的权限,win7需要提供管理员权限才能打开文件怎么解决...
  9. 树莓派服务器证书,【原创】在树莓派3上给Nginx部署免费HTTPS证书
  10. HALCON 21.11:深度学习笔记---术语表(7)
  11. php7 返回静态类,PHP7 – 未捕获错误:访问未声明的静态属性
  12. 创业公司的技术总监,去上市公司面试,结果凉了。
  13. php 数字转换为货币,php中数字转换成货币格式实现代码
  14. 人人商城小程序 java版_人人商城小程序用户授权问题
  15. 8大排序算法总结-Python
  16. 程序猿的24个段子:栈和队列的区别是啥?
  17. 3D建模学习对于电脑配置要求高不高?显卡内存等全方面解析,小白福音
  18. 5.9 使用新建调整图层命令调整图像 [原创Ps教程]
  19. JavaSE 知识大纲
  20. 探访广东第二鬼城,一座长在石油上的城市

热门文章

  1. win7笔记本外接显示器html,详解笔记本电脑连接外部显示器的操作流程
  2. windows 远程 登录无操作30分钟后自动退出登录_【计时优易学车远程教育学习流程】...
  3. 蓝牙心率检测仪涉及到的主要硬件组成
  4. 蓝牙协议--HFP协议--转
  5. mac安装软件允许任何来源(sudo spctl --master-disable)
  6. 艾美捷重组蛋白酶K,无动物源/AF化学性质介绍
  7. Android 毕业设计高仿新浪微博客户端(内附源码)
  8. 全球地名中英文对照表(B)
  9. Windows下安装使用Spacy英文库en_core_web_md,解决Warning: no model found for 'en_core_web_md'
  10. Ascent代码分析4-World之地图管理及实现结构