zoukankan      html  css  js  c++  java
  • 存储器性能测试

    Xeon E5620

    Xeon E5620

    E7500

    E7500

    In virtual machine, E7500

    最近做了个存储器性能测试,结果如上图。z轴表示速度,单位是MB/s, x轴和y轴一个表示步长,即两次访问数据之间的距离;另一个是读写的数据总量,单位是字节。源代码可以通过 http://csapp.cs.cmu.edu/public/1e/public/mountain.tar 获取。

    这个测试是CSAPP书里用来说明存储器山的一个实验。关于这个测试,有两个基本的概念:时间局部性与空间局部性。

    时间局部性:

    被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
     

    空间局部性:

    如果一个存储器的位置被引用,那么将来他附近的位置也会被引用
     
     
    从步长的轴上取出一个切面进行分析,x轴对应的是读写数据集的大小,y轴对应的是访问速度。这个切面表示的就是空间局部性。
    从数据集大小的轴上取出一个切面,x轴对应的是for循环访问数组时,步长的大小,y轴对应的是访问速度。这个切面表示的就是时间局部性。
     
     
    这两个特性,是由于CPU的分级缓存机制造成的。由于CPU速度越来越快,跟内存的读写速度拉开的差距也越来越大。为此,工程师们在硬件上引入了L1和L2 缓存层。L1、L2的读写速度很快,但是价格很贵,所以容量很小。
     
     
    CPU需要读写内存的时候,就往缓存里面找,找不到就会发生一次缓存缺失。缺失发生时,有多种应对的策略,具体可以参见 http://en.wikipedia.org/wiki/CPU_cache。缓存缺失时采用的策略,决定了什么样的数据块会留在缓存里,影响着时间局部性。在一个循环里,由于循环变量在每次循环时都会用到,长留在缓存里,不会发生缓存缺失,因此具有很好的时间局部性。
     
     
    读取内存时,并非只读取一个元素,而是读取所需元素及附近的元素到缓存中。若以后对数组的访问都是以步长为1进行访问的话,所需的数据已经先行进入缓存了,就会获得较好的空间局部性。
     
    好的程序,应该充分利用时间局部性和空间局部性,也就是说,需要将相关的数据尽可能相邻的放在一起,提高空间局部性。同时,优化逻辑,复用部分控制变量,实现短时间内多次访问,让变量始终在缓存中存在,提高读写性能。
     
    参见:
    http://zh.wikipedia.org/wiki/%E5%AD%98%E5%82%A8%E5%99%A8%E5%B1%B1
     
  • 相关阅读:
    git clone --early EOF
    weex 小结 -- <list>
    weex 小结 --官方扩展组件
    weex 小结--内建模块
    viewPager 的可滑动 Title
    viewPager + fragment
    onInterceptTouchEvent / onTouchEvent响应事件的详析
    startActivity跳转失败而且没有异常信息
    ios2048
    插入排序
  • 原文地址:https://www.cnblogs.com/Lifehacker/p/memory_mountain.html
Copyright © 2011-2022 走看看