算法与数据结构——内存与缓存

news/2024/9/20 22:54:39/文章来源:https://www.cnblogs.com/1873cy/p/18380084

内存与缓存

数组和链表两种数据结构分别代表了“连续存储”和“分散存储”两种物理结构。实际上,物理结构在很大程度上决定了程序对内存和缓存的使用效率,进而影响算法程序的整体性能。

计算机存储设备

计算机中包括三种类型的存储设备:硬盘(hard disk)、内存(random-access memory,RAM)、缓存(cache memory)。

它们有各自的用途与特性:

  • 硬盘:
    • 用途:长期存储数据,包括操作系统、程序、文件等。
    • 特性:断电后数据不会丢失
    • 容量:较大,TB级别
    • 速度:较慢,几百到几千 MB/s
  • 内存:
    • 用途:临时存储当前运行的程序和正在处理的数据。
    • 特性:断电后数据会丢失
    • 容量:较小,GB级别
    • 速度:较快,几十GB/s
  • 缓存:
    • 用途:存储经常访问的数据和指令,减少CPU访问内存的次数
    • 特性:断电后数据会丢失
    • 容量:非常小,MB级别
    • 速度:非常快,几十到几百GB/s

我们可以将计算机存储系统想象为如图所示的金字塔,越靠近金字塔顶端的存储设备的速度越快、容量越小、成本越高。

总的来说,硬盘用于长期存储大量数据,内存用于存储程序运行中正在处理的数据,而缓存则用于经常访问的数据和指令,以提高程序运行效率。三者共同协作,确保计算机系统高效运行。

在程序运行时,数据会从硬盘中被读取到内存中,供CPU计算使用。缓存可以看做CPU的一部分,它通过智能地从内存加载数据,给CPU提供高速的数据读取,从而显著提升程序的执行效率,减少对较慢内存的依赖。

数据结构的缓存效率

缓存虽然在空间容量上远小于内存,但它比内存快得多,在程序执行速度上起着至关重要的作用。由于缓存的容量有限,只能存储一小部分频繁访问的数据,因此当CPU尝试访问的数据不在缓存中时,就会发生缓存未命中(cache miss),此时CPU不得不从速度较慢的内存中国加载所需数据。

缓存未命中发生越少,CPU读写数据的效率就越高,程序性能也就越好。我们将CPU从缓存中成功获取数据的比例称为缓存命中率,用这个指标来衡量缓存效率。

为尽可能达到更高的效率,缓存会采取以下数据加载机制。

  • 缓存行:缓存不是单字节地存储与加载数据,而是以缓存行为单位。相比于单个字节的传输,缓存行的传输形式更加高效。
  • 预取机制:处理器会尝试预测数据访问模式(如顺序访问、固定步长访问等),并根据特定模式将数据加载至缓存之中从而提升命中率。
  • 空间布局性:如果一个数据被访问,那么它附近的数据也可能近期被访问。因此缓存在加载某一数据时,也会加载其附近的数据,以提高命中率。
  • 时间布局性:如果一个数据被访问,那么它在不久的将来很可能再次被访问。缓存利用这一原理,通过保留最近访问过的数据来提高命中率。

 

实际上,数组和链表对缓存的利用效率是不同的,主要体现在以下几个方面。

  • 占用空间:链表元素比数据元素占用空间更多,导致缓存中容纳有效数据量更少。
  • 缓存行:链表数据分散在内存各处,而缓存是“按行加载”的,因此加载到无效数据的比例跟高。
  • 预取机制:数组比链表数据访问模式更具“可预测性”,即系统更容易猜出即将被加载的数据。
  • 空间布局性:数组被存储在集中的内存空间中,因此被加载数据附近的数据更有可能即将被访问。

数组具有更高的缓存命中率,因此它在操作效率上通常优于链表。使得在解决算法问题时,基于数组实现的数据结构更受欢迎。

注意:高缓存效率并不意味着数组在所有情况下都优于链表。实际应用中选择哪种数据结构,应根据具体需求来决定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/787421.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot - [07] Web入门

题记部分 一、Web 入门SpringBoot将传统Web开发的mvc、json、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置。创建SpringBoot项目勾选SpringWeb选项后,会自动将spring-boot-starter-web组件加入到项目中。spring-boot-starter-web启动器主要包括w…

k8s~ServiceAccount_ClusterRole_ClusterRoleBinding

apisix的k8s服务发现配置 命名空间权限是基于Kubernetes RBAC能力的授权,通过权限设置可以让不同的用户或用户组拥有操作不同Kubernetes资源的权限。Kubernetes RBAC API定义了四种类型:Role、ClusterRole、RoleBinding与ClusterRoleBinding,这四种类型之间的关系和简要说明…

国产化适配——银河麒麟V10(2)

续上文 三、nignx安装 ng版本是:nginx-1.20.2 链接:https://pan.baidu.com/s/1gVJ_YgD-_gyJ6JL2VxoFhA 提取码:bqf4 版本比较老了,大家可以自己去官网下载最新的版本使用。 官网地址:https://nginx.org/en/download.html 1.挂载镜像 mount -t iso9660 /mnt/tools/Kylin-Se…

nessus使用教程心得

安装教程网络一大堆,这里就不多哔哔。点击查看代码 倒计时发USD不符合萨达办法1.输入你注册的账号密码进行登录,进入主页面。 ![](https://img2024.cnblogs.com/blog/3471184/202408/3471184-20240826102025745-788321108.png)2.点击“New Scan”新建一个扫描。 ![](https://…

Prometheus监控规则推荐网站

Prometheus监控规则推荐网站🔰Prometheus监控规则推荐网站: https://samber.github.io/awesome-prometheus-alerts/

Prometheus监控规则网站

Prometheus监控规则网站🔰Prometheus监控规则推荐网站: https://samber.github.io/awesome-prometheus-alerts/

学习vue3——element插槽

input 带有前缀图标1 <el-input 2 class="inputClass" 3 v-model="form.name" 4 ref="name" 5 placeholder="请输入用户名" 6 clearable 7 > 8 …

[ARC183D] Keep Perfectly Matched

树的重心,匹配My Blogs [ARC183D] Keep Perfectly Matched 这场不打感觉亏麻了,怎么大家都不会 D。首先匹配路径长度之和最大,很典的想到取重心,猜测答案上界 \(\sum_i dep_i\) 可以取到。 取完重心之后,希望不断把两个不同的子树里的点进行匹配,直到删空。因为原树本身存…

触想强固型工业显示器加速海上油气勘探开发

石油作为现代工业发展的主要能源,已成为国际间政治、经济博弈的重要工具。一、行业发展背景过去百年间,人类对陆地油气资源的勘探开发逐渐趋于饱和,而面对持续增长的全球能源需求,海洋勘探已成为当今油气能源角逐的主要“战场”,进一步催生出对先进的自动化海上钻井系统的…

Win11减少C盘占用及清爽系统配置教程

Win11减少C盘占用及清爽系统配置教程你是否有过C盘爆满而不得不重装系统的经历?你是否有过因为C盘爆满而不得不不断的拓展空间的无奈?你是否有过已经将软件安装在D盘但C盘的空间还是在日益变满的痛苦?好消息好消息!!!今天你看到了这篇文章从此就可以最大程度的告别C盘爆满…

浏览器启动首页被360篡改

可能原因: (一)浏览器快捷方式被篡改 (二)浏览器启动程序的启动行为被360监听,执行启动浏览器过程中被360进行篡改 解决方案一(edge为例):查找edge浏览器的安装路径: 右击edge浏览器-> 属性-> 快捷方式-> 起始位置删除桌面的edge快捷图标将edge安装路径的 ms…

应用如何快速实现云原生化?华为云DTSE解读关键策略

本文分享自华为云社区《DTSE Tech Talk | 第64期:DTSE与开发者同行,探索云原生实践,共筑高效云优化之路》,作者:华为云社区精选。 在主题是《DTSE与您同行,探索云原生实践,共筑高效云优化之路》的直播活动中👉(点击观看),华为云云原生DTSE技术布道师王逸真,与开发…