得到了我的PC的cache参数如下:
L1 Cache : 32KB , 8路组相连,linesize为 64Byte 64个组

L2 Cache:256KB 8路组相连,linesize为 64Byte 512个组

L3 Cache: 3MB 12路组相连,linesize为 64Byte 4096个组

1 、测试cache的linesize

代码看起来有点长,但是分成了3段。先看第一个测试,测试cache的linesize。

我们知道,cache的迁移是以linesize为单位的,所以,用户纵然只访问一个int,PC需要从主存拷贝1条line 进入Cache,对于我的电脑来说,就是copy 64B。

看下面的代码,测试linesize,如果K=1,遍历整个数组,如果K=16,只访问16倍数位置的值。依次类推。如果K=16,乘法的个数是K=1的时候1/16。我们可以推测,K=16的时候,程序执行时间是K=1的时候的1/16左右。是不是这样的。看下第一个测试用例的结果。

当K = 1 ,2,4 ......16的时候,虽然计算乘法的次数相差很大,但是,代码执行的时间是相近的都是80ms附近,但是当K = 32,64的时候,随着计算乘法的次数减半,代码执行的时间也减半。

原因在于,16 = (linesize)/sizeof(int)= 64/4,当K <16的时候,第一个int不命中,接下来的都命中的,乘法的个数虽然减半,但是从主存向Cache拷贝数据并没有减半。乘法消耗的指令周期要远低于从主存往cache里面copy数据,所以当K<16 的时候,既然从主存Cp数据到Cache的次数是相同的,那么总的执行时间差距不大就可以理解了。

当K>16的时候,每次都需要去主存取新的line,所以步长K增大一倍,去主存copy数据到cache的次数就减少为原来的一半,所以运行时间也减少为 原来的1半。

2、 Cache的大小

我的PC 有三级Cache,容量分别是32K 256K ,3M .这些参数对程序有什么影响呢。

下面的测试代码,执行的次数是一样的,都是64M次但是array的大小不一样。我们分别传入参数为1K,2K ,4K ,8K.....64MB 。在执行之前我们先分析下。

目前,如果array的大小是多大,循环执行的次数是一样的。我们的1级Cache大小是32KB,也就是最多容纳8192个int。

如果我们的数组大小就是8192个int,那么除了第一次执行需要将数据从 主存-->L3 Cache--->L2 Cache -->L1 Cache传上来,后面再次执行的时候,由于整个数组全在L1 Cache,L1 Cache命中,速度很快。当然如果数组大小小于8192个int,L1更能容纳的下。8192是个坎。数组大于8192个int,性能就会下降一点。

如果我们的array大小大于L1 cache容量会怎样呢?看下我们的L2 Cache,大小256KB,即64K个int,换句话说,如果数组长度小于64K个int,也不赖,至少L2 Cache 容纳的下,虽然L1 Cache每写满32KB就需要将交换出去。换句话说,64K是个坎,数组大于64K个int,性能就会下降。

L3Cache我就不说,毕竟我不是唐僧,一样的情况,对于我的3M 缓存,3M/4 = 768K 是个坎,如果数组大于768个int,那么性能又会下降。

好了可以看下面的图了,和我们想的一样,

当低于8192的时候,都是120ms 左右,

[8192,64K ]的时候,都是200ms 左右

[64K ,768K ]的时候,都是300ms左右

大于768的时候,1200ms左右。

第三部分我就不讲了,源代码给出大家可以自己在电脑上研究。不过第三部分要比较难懂,而且我前面提到的那篇讲的也不是很好懂。

下面是我的测试全代码

最新文章

  1. LDAP与SSH
  2. xdg-open 打开“irc:*”链接
  3. 前台实现下载xml功能
  4. validate中remote的用法
  5. [转载]Winform等待窗口的实现(附源代码)
  6. Linux内存初始化
  7. Windows下ANSI、Unicode、UTF8字符编码转换
  8. lucene 使用教程
  9. 3.从AbstractQueuedSynchronizer(AQS)说起(2)——共享模式的锁获取与释放
  10. Effective Java 第三版——7. 消除过期的对象引用
  11. vue与dajngo
  12. 如何系统的学习Java
  13. class用法
  14. OCM_第二十天课程:Section9 &mdash;》Data Guard _ DATA GUARD 搭建/DATA GUARD 管理
  15. C语言复习:编译
  16. 剑指offer五之用两个栈实现队列
  17. No.1101_第十次团队会议
  18. 使用jquery的 $.grep实现es6的filter效果
  19. K组翻转链表 &#183; Reverse Nodes in k-Group
  20. Java循环跳转语句之 break

热门文章

  1. 浅谈基于WOPI协议实现跨浏览器的Office在线编辑解决方案
  2. 分布式系统监视zabbix讲解六之自定义监控项--技术流ken
  3. Map相关知识总结
  4. 我的python渗透测试工具之主机嗅探
  5. 从零开始学安全(二十七)●利用Nmap对防火墙,IDS,IPS 进行欺骗
  6. [javaEE] web应用的目录结构&amp;配置虚拟主机
  7. java关于字符串的一些实用操作工具类方法
  8. 怎么打开在.bashrc文件以及设置颜色
  9. Github被微软收购,这里整理了16个替代品
  10. CSS用法总结(持续更新)