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 ms Equivalent 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 ms Equivalent 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 ms Full, 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 ms Full, 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重新加载次数也在递减。
相关推荐
NULL 博文链接:https://schi.iteye.com/blog/843083
通过实验获得的真实数据记录与分析,Cache的大小对系统性能的影响。
接访问数据,从而获得极高的存取速度和极强的并发访问能力的数据库管理系统,在设计风格上兼容主流数据库(MS SQL SERVER、SYBASE)的特点,宿主进程通过在本进程内加载Cache Server直接访问内存数据库。 Cache ...
CPU 中cache line的c++模型
ttlcache, 在内存中,golang的字符串字符串映射过期, TTLCache - 具有过期的内存LRU缓存TTLCache是golang中字符串映射的最小包装,其中的条目为线程安全在一定时间后自动过期在 Get 上自动延长到期时间 用法import ...
操作系统中的Cache与内存间的置换算法有LRU,FIFO等经典算法,作者首先程序实现了此2种算法,并在此2者的基础上创新出一个新的置换算法LRU_FIFO算法,获得高校教师很高评价,该算法结合LRU与FIFO的特点,也可单独...
序列cache对性能的影响,高并发性设计。
Cache Server网络内存数据库是将所有数据加载到物理内存,不需要访问磁盘 就直接访问数据,从而获得极高的存取速度和极强的并发访问能力的数据库管理系统,在设计风格上兼容主流数据库(MS SQL SERVER、SYBASE)的...
通过合理设计内存块数据结构,利用数组索引定位到内存链表,并结合CPU-Cache的 优化,实现了一个急速高效的服务端内存池。
J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求至少 Java 8)。第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memcached 。 由于大量的缓存读取会导致 L2...
J2Cache —— 基于内存和 Redis 的两级 Java 缓存框架。J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求至少 Java 8)。第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 ...
我们通过free命令查看机器空闲内存时,会发现free的值很...这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。
在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得...
Linux的产生与发展,更多的应用与服务器,那么对于Linux的各个管理机制要非常清 楚,一个完整的Linux系统主要有存储管理,内存管理,文件系统和进程管理等几...本文将为大家介绍Linux内存中Swap和Buffer Cache机制。
Cache映像策略和数据访问流性能分析
Linux内核内存Cache机制原理从源码的角度来分析流程,可以帮助Linux内核学习者了结Cache的内存机制!
3) 改变Cache容量(*2,*4,*8,*64),运行程序(指明所选的测试程序),统计各种失效的次数,并分析Cache容量对Cache性能的影响; 4) 改变Cache的相联度(1路,2路,4路,8路,64路),运行程序(指明所选的测试...
ramdisk+supercache内存做硬盘,显著提升电脑速度,做到多余内存不浪费,特别适用于大内存(≥4G)的32位操作系统。
Volley+Cache 实现网络缓存以及内存缓存
Intel Cache Acceleration Software 最新版 Premium primocahe CAS 傲腾内存