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

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

3天内不再提示

Linux性能优化:Cache对性能的影响

麦辣鸡腿堡 来源:嵌入式Linux充电站 作者: Vincent 2023-10-04 15:31 次阅读

Cache对性能的影响首先我们要知道,CPU访问内存时,不是直接去访问内存的,而是先访问缓存(cache)。

当缓存中已经有了我们要的数据时,CPU就会直接从缓存中读数据,而不是从内存中读。

CPU和缓存的关系如下:

图片

缓存分为一级、二级、三级,最靠近CPU的是一级缓存,最远的是内存,离CPU越近速度越快。

访问速度上,L1》L2》L3》内存,缓存比内存速度要快得非常多。

如果CPU操作的数据在缓存中,则直接从缓存中读取,这个过程就叫缓存命中。

因此提升性能的关键,就是要提高缓存命中率。下面来看如何提高缓存命中率。

提高数据缓存命中率来看一个实例,有一个N*N的二维数组,例如:

int array[N][N];

现在用两个for循环遍历这个数组,访问每个元素的内容:

for(i = 0; i 《 N; i+=1) { for(j = 0; j 《 N; j+=1) { array[i][j] = 0;//速度快
//array[j][i] = 0;//速度慢 } }

有两种访问方式:array[i][j]和array[j][i]。

在性能上,array[i][j]会比array[j][i]执行地更快,并且速度相差8倍。

1、速度更快的原因

首先数组在内存上是连续的,假设N等于2,则array[2][2]在内存中的排布是:

array[0][0]、array[0][1]、array[1][0]、array[1][1]、

以array[i][j]方式访问,即按内存中的顺序访问,当访问array[0][0]时,CPU就已经把数组的剩余三个数据(array[0][1]、array[1][0]、array[1][1])加载到了缓存当中。

当继续访问后三个元素时,CPU会直接从缓存中读取数据,而不需要从内存中读取(cache命中)。因此速度会很快。

如果以array[j][i]方式访问数组,则访问顺序为:

array[0][0]、array[1][0]、array[0][1]、array[1][1]

此时访问顺序是跳跃的,并不是按数组在内存中的的排布顺序来访问。如果N很大的话,那么执行array[j][i]时,array[j+1][i]的内容是没法读进缓存里的,等到要访问array[j+1][i]时就只能从内存中读取。

所以array[j][i]的速度会慢于array[i][j]。

2、速度相差8倍的原因

刚刚提到,如果这个二维数组的N很大,array[j+1][i]的内容是没法读到缓存里的,那CPU一次能够将多少数据加载进缓存里呢?

这个其实跟cache line有关,cache line代表缓存一次载入数据的大小。可以通过以下命令查看cache line为多大:

cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size

图片

cache line为64,代表CPU缓存一次数据的大小为64字节。

当访问array[0][0]时,该元素所占用的字节数不到64字节,CPU就会按顺序补足后续元素,就会把后面的array[0][1]、array[1][0]等内容一起读到缓存里,直到凑够64字节。

正因如此,按顺序访问的array[i][j]才会比不按顺序访问的array[j][i]速度快。

再看看为什么速度相差8倍。我们知道,二维数组中,第一维元素放的是地址,第二维元素才是数据。64位系统中,地址占用8个字节,cache
line为64的话,地址已经占用了8字节,那每个cache line最多能载入不到8个二维数组元素,N很大的情况下,他们的性能平均下来就会相差将近8倍。

结论:按内存布局顺序访问,可以提高数据缓存命中率。

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

    关注

    68

    文章

    10446

    浏览量

    206575
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • Cache
    +关注

    关注

    0

    文章

    127

    浏览量

    27986
收藏 人收藏

    评论

    相关推荐

    Linux性能优化大全!

    高并发和响应快对应着性能优化的两个核心指标:吞吐和延时
    发表于 11-21 11:23 587次阅读

    NAS存储系统性能优化攻略

    无论是程序员,DBA还是网管,似乎所有的ITer都会遭遇同一问题:性能优化。NAS从业者也不例外,而且NAS的问题更加棘手,因为它所涉及的协议和设备很多。本系列博文将从共享协议入手,再到网络,最后
    发表于 12-29 13:52

    HBase性能优化方法总结

    HBase是Hadoop生态系统中的一个组件,是一个分布式、面向列的开源数据库,可以支持数百万列、超过10亿行的数据存储,因此,对HBase性能提出了一定的要求,那么如何进行HBase性能优化
    发表于 04-20 17:16

    请教关于EDMA和cache优化的疑惑

    中,是不是把数据直接从SDRAM或者DDR搬运到L1DSRAM 会比简单的DDR开启cache获得更好的性能呢?
    发表于 07-27 09:38

    Linux系统的性能优化策略

    近年来,世界上许多大软件公司纷纷推出各种Linux服务器系统及Linux下的应用软件。目前,Linux 已可以与各种传统的商业操作系统分庭抗礼,在服务器市场,占据了相当大的份额。本文分别从磁盘调优,文件系统,内存管理以及编译
    发表于 07-16 06:23

    linux网络发包性能优化方法

    对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性能优化则可基于这 3 条路径来考虑。
    发表于 07-16 06:05

    Linux和Android系统故障和优化性能的方法和流程探讨

    作为一名Linux 或 Android 平台的系统工程师,在开发系统新功能外,主要工作就是优化系统性能,使系统上以最优的状态运行,但是由于硬件问题、软件问题、网络环境等的复杂性和多变性,导致对系统
    发表于 07-22 06:48

    linux性能问题

    最主要的工作是优化系统配置,使应用在系统上以最优的状态运行,但是由于硬件问题、软件问题、网络环境等的复杂性 和多变性,导致对系统的优化变得异常复杂,如何定位性能问题出在哪个方面,是性能
    发表于 07-22 06:50

    基于Linux的Socket网络编程的性能优化

    基于Linux的Socket网络编程的性能优化 随着Intenet的日益发展和普及,网络在嵌入式系统中应用非常广泛,越来越多的嵌入式设备采用Linux操作系统。
    发表于 10-22 20:48 995次阅读
    基于<b class='flag-5'>Linux</b>的Socket网络编程的<b class='flag-5'>性能</b><b class='flag-5'>优化</b>

    你知道linuxcache memory?

    当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory
    发表于 04-26 15:49 1115次阅读

    Linux CPU的性能应该如何优化

    Linux系统中,由于成本的限制,往往会存在资源上的不足,例如 CPU、内存、网络、IO 性能。本文,就对 Linux 进程和 CPU 的原理进行分析,总结出 CPU 性能
    的头像 发表于 01-18 08:52 3138次阅读

    Linux内核文件Cache机制

    Linux内核文件Cache机制(开关电源技术与设计 第二版)-Linux内核文件Cache机制                
    发表于 08-31 16:34 4次下载
    <b class='flag-5'>Linux</b>内核文件<b class='flag-5'>Cache</b>机制

    cache的排布与CPU的典型分布

    cache的掌握,对于Linux工程师(其他的非Linux工程师也一样)写出高效能代码,以及优化Linux系统的
    的头像 发表于 10-18 09:01 1277次阅读

    Cache性能优化精彩问答38条

    占用非常大的面积,大概在一半以上,而且一个好的 Cache 的设计复杂度非常高,可能比较 CPU 的 Pipeline 还要复杂。这里要考虑成本,设计复杂度,或者其他方面的考虑。你知道 L1
    的头像 发表于 01-11 09:34 914次阅读

    Linux内核slab性能优化的核心思想

    今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是
    的头像 发表于 11-13 11:45 330次阅读
    <b class='flag-5'>Linux</b>内核slab<b class='flag-5'>性能</b><b class='flag-5'>优化</b>的核心思想