0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

内存访问的在不同的访问场景下延时究竟是个什么表现

冬至配饺子 来源:开发内功修炼 作者:张彦飞allen 2022-08-30 16:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

《内存随机访问也比顺序慢,带你深入理解内存IO过程》一文中,我们理解了内存IO的内部实现过程,知道了内存的随机IO比顺序IO要慢,并对延迟时间进行了大概的估算。那么我们今天来用代码的方式来实践一下,看看在我们的项目工程中,内存访问的在不同的访问场景下延时究竟是个什么表现。

1、先测顺序IO情况

测试原理就是定义一个指定大小的double(8字节)数组,然后以指定的步长去循环。这里面的变量有两个。核心代码如下:

poYBAGMNz2mAZF06AABxRIyCwls569.png

在这个核心代码的基础上,我们有两个可调节变量:

一是数组大小,数组越小,高速缓存命中率越高,平均延时就会越低。

二是循环步长,步长越小,顺序性越好,同样也会增加缓存命中率,平均延时也低。我们在测试的过程中采取的办法是,固定其中一个变量,然后动态调节另外一个变量来查看效果。

另外说明一下,这个代码测试中考虑的几个额外的开销的处理情况。

1.加法开销:由于加法指令简单,一个CPU周期就可完成,CPU周期比内存周期要快,所以暂且忽略它。
2.耗时统计:这涉及到高开销的系统调用,本实验通过跑1000次取一次耗时的方式来降低影响。

场景一:固定数组大小2K,调节步长

pYYBAGMNz3-Ac42ZAAA2xVT2MPg658.png

数组足够小的时候,L1 cache全部都能装的下。内存IO发生较少,大部分都是高效的缓存IO,所以我这里看到的内存延时只有1ns左右,这其实只是虚拟地址转换+L1访问的延时。

场景二:固定步长为8,数组从32K到64M

poYBAGMNz5iACkyjAAA5DK1zPEY968.png

当数组越来越大,Cache装不下,导致穿透高速缓存,到内存实际IO的次数就会变多,平均耗时就增加

场景三:步长为32,数组从32K到64M

poYBAGMNz62ANXyLAABDMDMN_4o231.png

和场景二相比,步长变大以后,局部性变差,穿透的内存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的测试中,我们要彻底打乱这个规律,提前随机好一个下标数组,实验时不停地访问数组的各个随机位置。

pYYBAGMNz72ASSnXAACFkWasV7E580.png

这实际比上面的实验多了一次内存IO,但由于对random_index_arr的访问时顺序的,而且该数组也比较小。我们假设它全部能命中高速缓存,所以暂且忽略它的影响。

随机实验场景:数组从32K到64M

pYYBAGMNz9KAdfHzAAA2C21U8jQ933.png

这次的数组访问就没有步长的概念了,全部打乱,随机访问。当数据集比较小的时候、L1、L2、L3还能抗一抗。但当增加到16M、64M以后,穿透到内存的IO情况会变多,穿透过去以后极大可能行地址也会变。在64M的数据集中,内存的延时竟然下降到了38.4ns,和我们估算的也基本一致。

3、结论

有了实验数据的佐证,进一步证实了《内存随机访问也比顺序慢,带你深入理解内存IO过程》的结论。内存存在随机访问比顺序访问慢的多的情况,大概是4:1的关系。所以不要觉得内存很快,就用起来太随性了!



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11374

    浏览量

    226412
  • 内存
    +关注

    关注

    9

    文章

    3258

    浏览量

    76597
  • 高速缓存
    +关注

    关注

    0

    文章

    30

    浏览量

    11355
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    K8s服务访问不通的排查方法

    Kubernetes 里服务访问不通是比节点 NotReady 更常见的故障场景。相比节点 NotReady 这种基础设施层的问题,服务访问不通直接表现为业务不可用——用户能打开页面但
    的头像 发表于 05-11 16:49 199次阅读

    无法通过 ssh 访问怎么解决?

    我无法通过 ssh 访问 VisionFive V1,即使本地子网/网络中也无法访问。相比之下,我确实可以 ssh 访问 V1 所连接的同一路由器上的 RaspPi。所以这不是路由器
    发表于 04-01 07:11

    极海Cortex-M52内核MCU G32R501CoreMark的表现如何

    要真正衡量一颗MCU的运算实力,CoreMark成绩往往是一比较客观、公认的参考指标。到底这个G32R501跑起CoreMark来能交出怎样的成绩单?今天就让我们一起“探秘”一番,看这款Cortex-M52 MCUCoreMark上的
    的头像 发表于 03-09 14:09 4127次阅读
    极海Cortex-M52内核MCU G32R501<b class='flag-5'>在</b>CoreMark的<b class='flag-5'>表现</b>如何

    什么是 SASE?| 安全访问服务边缘

    安全访问服务边缘(SASE)是一种整合网络连接与网络安全功能于一平台的架构。这种架构与传统的企业网络相比,具有显著的差异。SASE架构将网络控制放置云边缘,而不是传统企业数据中心,这使得企业能够
    的头像 发表于 02-02 18:28 518次阅读

    本地智能家居系统ESPHome,实现远程访问调试

    ESPHome 是一开源固件框架,支持通过 YAML 配置实现智能家居自动化,可本地部署并公网访问,便于远程开发。
    的头像 发表于 12-30 14:48 1672次阅读
    本地智能家居系统ESPHome,实现远程<b class='flag-5'>访问</b>调试

    C语言访问某特定内存位置

    嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一纯粹的ANSI编译器。写代码去完成这一任
    发表于 12-22 15:42

    32位究竟指什么呢?

      1. 更高的性能   由于能够一次性处理更多的数据,32位单片机执行复杂计算任务时表现更为出色。它能够更快速、更高效地运行复杂的算法和应用程序。   2. 更大的内存空间   32位单片机能够直接
    发表于 11-21 06:32

    电能质量在线监测装置的数据云端的访问权限是如何管控的?

    电能质量在线监测装置的数据云端的访问权限管控,是通过 角色分级、动态验证、加密隔离、智能策略 等多重机制构建的立体化防护体系,其核心目标是确保数据 “只能被授权的人、授权的时间、以授权的方式
    的头像 发表于 10-30 09:45 444次阅读

    企业安全访问网关:ZeroNews反向代理

    花半天时间配置VPN账号。” 这些场景您是否遇到过? 传统的VPN(虚拟专用网)在为企业提供远程接入能力的同时,其 “全有或全无” 的粗放式网络接入模式,已成为企业安全体系中的一巨大裂缝。一旦接入,用户就如同进入了内网,访问
    的头像 发表于 10-14 10:50 512次阅读
    企业安全<b class='flag-5'>访问</b>网关:ZeroNews反向代理

    qkey软件包在内核V5.02运行出错是哪里的问题?

    ) == RT_Object_Class_Memory) assertion failed at function:rt_smem_alloc, line number:290 ; 然后内核改成V4.1.1就没任何问题。 因为v5.0.2引入backtrace也始终有编译问题,所以不好跟踪
    发表于 09-15 07:46

    远程访问NAS不折腾,轻松获取固定访问地址!

    。 传统方案通常需要公网IP或复杂的路由器设置,不仅成本高且操作繁琐。 ZeroNews 无需公网IP、免配置路由器,三步即可实现NAS的远程访问。 简易配置,快速生成固定访问地址 以群晖DSM系统为例,远程访问配置流程如下:
    的头像 发表于 09-02 19:20 1123次阅读
    远程<b class='flag-5'>访问</b>NAS不折腾,轻松获取固定<b class='flag-5'>访问</b>地址!

    IR615怎么禁止设备访问外网?

    IR615使用VPN连到云平台,最近发现4G流量使用激增,估计其它设备蹭网,怎么设置一防止其它设备通过路由器访问外网,多谢
    发表于 08-06 06:31

    禁用直接LPB访问,如何与TC3x 上的 SWAPEN 协同工作?

    禁用直接 LPB 访问 (xDDIS) 位可通过 TC37x 的 FLASHCON4 和 PROCONTP 进行配置。 SOTA 场景中,我们应该如何配置上述两寄存器? 如果我启用
    发表于 07-29 10:26

    RT-Thread SPI链式传输非法访问?揭秘致命陷阱!

    前言一、与RT-ThreadBSP的开发者沟通中,发现SPI设备驱动轮询(Polling)模式偶发出现非法访问异常(如图)问题复现场景
    的头像 发表于 06-24 19:38 1859次阅读
    RT-Thread SPI链式传输非法<b class='flag-5'>访问</b>?揭秘致命陷阱!

    超声波液位计究竟是什么?

    液位计
    jzyb
    发布于 :2025年06月03日 16:10:12