在《内存随机访问也比顺序慢,带你深入理解内存io过程》一文中,我们理解了内存io的内部实现过程,知道了内存的随机io比顺序io要慢,并对延迟时间进行了大概的估算。那么我们今天来用代码的方式来实践一下,看看在我们的项目工程中,内存访问的在不同的访问场景下延时究竟是个什么表现。
1、先测顺序io情况
测试原理就是定义一个指定大小的double(8字节)数组,然后以指定的步长去循环。这里面的变量有两个。核心代码如下:
在这个核心代码的基础上,我们有两个可调节变量:
一是数组大小,数组越小,高速缓存命中率越高,平均延时就会越低。
二是循环步长,步长越小,顺序性越好,同样也会增加缓存命中率,平均延时也低。我们在测试的过程中采取的办法是,固定其中一个变量,然后动态调节另外一个变量来查看效果。
另外说明一下,这个代码测试中考虑的几个额外的开销的处理情况。
1.加法开销:由于加法指令简单,一个cpu周期就可完成,cpu周期比内存周期要快,所以暂且忽略它。
2.耗时统计:这涉及到高开销的系统调用,本实验通过跑1000次取一次耗时的方式来降低影响。
场景一:固定数组大小2k,调节步长
数组足够小的时候,l1 cache全部都能装的下。内存io发生较少,大部分都是高效的缓存io,所以我这里看到的内存延时只有1ns左右,这其实只是虚拟地址转换+l1访问的延时。
场景二:固定步长为8,数组从32k到64m
当数组越来越大,cache装不下,导致穿透高速缓存,到内存实际io的次数就会变多,平均耗时就增加
场景三:步长为32,数组从32k到64m
和场景二相比,步长变大以后,局部性变差,穿透的内存io进一步增加。虽然数据量一样大,但是平均耗时就会继续有所上涨。不过虽然穿透增加,但由于访问地址仍然相对比较连续,所以即使发生内存io也绝大部分都是行地址不变的顺序io情况。所以耗时在9ns左右,和之前估算大致相符!
另外注意一个细节,就是随着数组从64m到32m变化的过程中。耗时有几个明显的下降点,分别是8m,256k和32k。这是因为本机的cpu的l1大小是32k,l2是256k,l3是12m。在数据集32k的时候,l1全能装的下,所有基本都是高速缓存io。256k的时候、8m的时候,虽然l1命中率下降,但是l2、l3访问速度仍然比真正的内存io快。但是超过12m以后越多,真正的内存io就越来越多了。
2、再测随机io情况
在顺序的实验场景里,数组的下标访问都是比较有规律地递增。在随机io的测试中,我们要彻底打乱这个规律,提前随机好一个下标数组,实验时不停地访问数组的各个随机位置。
这实际比上面的实验多了一次内存io,但由于对random_index_arr的访问时顺序的,而且该数组也比较小。我们假设它全部能命中高速缓存,所以暂且忽略它的影响。
随机实验场景:数组从32k到64m
这次的数组访问就没有步长的概念了,全部打乱,随机访问。当数据集比较小的时候、l1、l2、l3还能抗一抗。但当增加到16m、64m以后,穿透到内存的io情况会变多,穿透过去以后极大可能行地址也会变。在64m的数据集中,内存的延时竟然下降到了38.4ns,和我们估算的也基本一致。
3、结论
有了实验数据的佐证,进一步证实了《内存随机访问也比顺序慢,带你深入理解内存io过程》的结论。内存存在随机访问比顺序访问慢的多的情况,大概是4:1的关系。所以不要觉得内存很快,就用起来太随性了!
TCL发布TCL PLEX手机,骁龙675+6.53英寸+123°超广角相机
华为畅享7和红米Note4X哪个好?性价比评测分析
TDK 公司宣布推出 TDK-Lambda 品牌的 CUS30M 和 CUS60M 系列交流/直流电源
电桥回线法在电缆故障测距中的应用
嵌入式状态机的设计与实现
内存访问的在不同的访问场景下延时究竟是个什么表现
首个工业级无人机云平台发布,是工业级无人机产业发展良好的开端
石墨烯制备方法概述
中国联通与高通物联网联合创新中心揭牌启动,推动5G与物联网发展
汽车电子新闻:华尔街看好Waymo:2030年营收可以破千亿美元
美方严厉管制先进技术出口?韩企很庆幸
瑞为技术智助登机方案精彩亮相新加坡APEX未来旅客体验展
阿克隆耐磨试验机特点及用途
台湾地区显示器市场仍然面临疲软的趋势
Apple Watch芯片级拆解,WiFi功能这是闹哪样?
纸张在线缺陷检测系统的详细介绍
一种有效将3D点云分割成平面组件的多分辨率方法
iPhone12首发第二天,价格继续缓慢下跌
爱陆通4G5G专网PLC点对点通讯组网方案
单片机入门的经验总结