跟我学c++中级篇——C++中的缓存利用

一、缓存

学习过计算机知识的一般都知道缓存这个概念,大约也知道缓存是什么。但是如果是程序员,如何更好的利用缓存,可能就有很多人不太清楚了。其实缓存的目的非常简单,就是了更高效的操作数据。大家都听说过“局部性原理”,可以这样说,如果计算机中不存在局部性原理这个概念,就不大会有缓存这个概念。
局部性原理可以划分为时间局部性和空间局部性,这个非常好理解。前者指在较短的时间内不断的访问相同的数据;后者则为访问的数据空间范围较小(比如数组,可能更容易访问附近的数据)。
这里不给大家分析硬件或者其它什么几级缓存的相关技术,那些分析无论是书籍还是资料或者网上都非常多,这里只分析缓存的应用级别的情况。
伪共享 局部性原理

二、缓存命中

一般来说,缓存的主要作用就是增加了一个快速访问的中间层,减少了去较慢的内存中操作数据的过程。所以其命中率可以考虑下面两个方面:
1、缓存大小
缓存的大小直接决定的命中率的高低,理论上讲,缓存越大越好。但这玩意儿贵啊。而且一般缓存都在CPU内部,成本相当高昂。所以要大小适中,后来为了增加命中率,又非常聪明的想出了多级缓存的方式,从而平衡命中率和命中代价。至于缓存分级有兴趣可以查看一下相关书籍。
2、缓存替换策略
缓存也可以看做内存,所以它也有管理的策略。想一下内存中如何替换内存页,缓存基本也差不多。这里就存在一个问题,如果当几次没有命中的数据如何被替换?假如刚刚替换出去的又要访问,不就降低了访问的效率么。所以这个替换的策略也非常重要,常见的如LRU,FIFO,LFU等等,大家可查看相关的资料,这里不是重点就不展开了。
一般来说,只要指定是硬件,缓存基本大小就无法更改了。相关的替换策略一般也很少改动,但可以根据需要选取合适的CPU更好。

三、C++如何更高效的利用缓存

既然控制不了缓存的大小,但可以根据相关的策略和缓存的原理进行编码的控制。缓存的原理就是局部性的问题,也即空间和时间上的局部性。那么在时间局部性上就可以把经常访问的数据放到缓存(或寄存器);而空间局部性上就可以把经常访问的相关数据放在一起引入缓存中去。那大方向就指明了,C++编码可以做如下的控制:
1、内存处理
要想将内存的数据有效的转化为缓存,提高命中效率,可以从优化布局,比如常见的结构体的字段的顺序啊,指针数据的处理啊等等。内存对齐 ,这个更常见。把相关的数据搞到和Cache行大小相关(最小单元的处理);另外就是多使用类似数组的连续内存数据结构,少使用类似List这种非连续的内存。
2、函数处理
要想增加函数处理的效率,首先想到的就是使用内联函数,同时减少函数中的对象的传递,特别是大对象的传递。要避免过深的嵌套调用和递归调用,防止缓存中途失效,还需要重新从内存加载就得不偿失了。
3、循环处理
前面分析过循环处理的很多优化,往往编译器都能做到。但还是需要注意要对相关的循环过程中的循环次数的优化,特别是在处理一些大型的数据时(比如特别大的数组、矩阵等)可以考虑前面并行编程优化时提到的分块处理,分治同样也适应缓存的优化。
4、IO的控制
在一些库或接口中,提供了硬盘等IO的缓冲设置,其实这也可以划到缓存当中来。如果使用良好的预读写函数处理,可能大幅度提高缓存的命中率真,从而提高读写的效率。
5、使用内存或对象池
这个很容易明白,其实和使用数组方式类似,将相关的对象直接固定在一个位置而不是反复的分配,无法形成有效的缓存。
6、减少判断和跳转的语句
这个不光对缓存有用,对CPU中的流水指令也很重要,经常的反复的无规则的跳转,缓存就失去了意义 。
7、减少内存碎片
内存碎片增多,就意味着连续性的降低,从而导致缓存在固定的大小范围内引入的相关范围的减少,从概率上讲,会降低命中率。消除内存碎片最常用的是使用内存池技术。
8、消除伪共享
这个非常重要,在如今多核泛滥的情况下,不处理这种情况,就等于是降低命中率。可以参看前面的文章“多线程的伪共享”中消除的方法即使用填充法或使用一些关键字来处理。
9、处理好并行情况的竞态
这个其实和判断语句有些相似,都是尽量保证高命率的可能的内存数据保留在缓存中,毕竟缓存的大小有限。

四、例程

下面看一些简单的应用:

//使用关键字处理对齐
struct alignas(8) Test {int a;int32_t b;
};
//数组行优先访问
for (int r = 0; r < 1000; ++r) {for (int c = 0; c < 1000; ++c) {array[r][c] = 0;}}
}
//循环优化
for (int i = 0; i < 800; i += 8) {readData(array[i]);readData(array[i+1]);readData(array[i+2]);readData(array[i+3]);readData(array[i+4]);readData(array[i+5]);readData(array[i+6]);readData(array[i+7]);
}
//经常访问数据放置相近
struct Data{
...
int height,weight,old;...
};

其实这些方法很简单,就是使用的时候要在思想上有一个处理的想法,而不是粗暴的想到哪儿就写到哪儿。

五、总结

总之,如何在编程层面对缓存命中进行处理,是一个综合考量的过程。开发者需要根据实际情况如何用最小的代价实现更好的命中率。不过可惜的是,对于大多数程序员来说,这都是在实际场景中很难遇到的情况。对于普通程序员来说,好好优化,但不要过度优化代码,更不要过早的展开优化。养成一个好的数据定义的内存布局概念,就基本可以达到要求了。
不过,需要注意的是,不同的架构芯片可能缓存机制有所不同,如果真要写贴近硬件的缓存机制相关代码,需要严格的按照相关的硬件说明进行。

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

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

相关文章

KNN分类算法 HNUST【数据分析技术】(2025)

1.理论知识 KNN&#xff08;K-Nearest Neighbor&#xff09;算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类&#xff0c;也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。 KNN算法的思想&#xff1a; 对于任意n维输入向量&#xff0c;分别对应于特征…

宝塔-firefox(Docker应用)-构建自己的Web浏览器

安装基础软件 宝塔中安装firefox(Docker应用) 。宝塔中需要先安装docker及docker-composefirefox配置安装 点击firefox应用&#xff0c;选择【安装配置】点击右边绿色按钮&#xff0c;进行安装&#xff0c;这一步等待docker-compose根据你的配置初始化docker应用 等待安装 …

如何从 0 到 1 ,打造全新一代分布式数据架构

导读&#xff1a;本文从 DIKW&#xff08;数据、信息、知识、智慧&#xff09; 模型视角出发&#xff0c;探讨数字世界中数据的重要性问题。接着站在业务视角&#xff0c;讨论了在不断满足业务诉求&#xff08;特别是 AI 需求&#xff09;的过程中&#xff0c;数据系统是如何一…

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台&#xff0c;集成了版本控制、代码审查、问题跟踪、持续集成与持续交付&#xff08;CI/CD&#xff09;等多种功能&#xff0c;旨在为团队提供一站式的项目管理解决方案。借助 GitLab&#xff0c;开发…

芯片Tapeout power signoff 之IR Drop Redhawk Ploc文件格式及其意义

数字IC后端工程师在芯片流程最后阶段都会使用redhawk或voltus进行设计的IR Drop功耗signoff分析。必须确保静态&#xff0c;动态ir drop都符合signoff标准。 在做redhawk ir drop分析前&#xff0c;我们需要提供一个redhawk ploc供电点坐标。 数字IC设计后端实现前期预防IR D…

HarmonyOS NEXT 实战之元服务:静态案例效果---查看国内航班服务

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index代码 import { authen…

python+requests接口自动化测试框架实例详解

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

前端:改变鼠标点击物体的颜色

需求&#xff1a; 需要改变图片中某一物体的颜色&#xff0c;该物体是纯色&#xff1b; 鼠标点击哪个物体&#xff0c;哪个物体的颜色变为指定的颜色&#xff0c;利用canvas实现。 演示案例 代码Demo <!DOCTYPE html> <html lang"en"><head>&l…

聊一聊 C#前台线程 如何阻塞程序退出

一&#xff1a;背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题&#xff1a;后台线程的内部是如何运转的 ? &#xff0c;犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程序无法退出的bug&#xff0c;最后发现是有一个 Backgrond…

Nmap基础入门及常用命令汇总

Nmap基础入门 免责声明&#xff1a;本文单纯分享技术&#xff0c;请大家使用过程中遵守法律法规~ 介绍及安装 nmap是网络扫描和主机检测的工具。作为一个渗透测试人员&#xff0c;必不可少的就是获取信息。那么nmap就是我们从互联网上获取信息的途径&#xff0c;我们可以扫描互…

Excel中一次查询返回多列

使用Excel或wps的时候&#xff0c;有时候需要一次查询返回多列内容&#xff0c;这种情况可以选择多次vlookup或者多次xlookup&#xff0c;但是这种做法费时费力不说&#xff0c;效率还有些低下&#xff0c;特别是要查询的列数过多时。我放了3种查询方法&#xff0c;效果图&…

NodeMCU驱动28BYJ-48型步进电机(Arduino)

NodeMCU NodeMCU开发板 此NodeMCU是在乐鑫公司&#xff08;Espressif Systems&#xff09;生产的ESP-12F模组的基础上封装好的具备WiFi功能的开源IoT开发板。本次选用安信可公司&#xff08;Ai-Thinker&#xff09;生产的CP2102版本的开发板。 28BYJ-48型步进电机 28BYJ-48型…

qt QZipReader详解

1、概述 QZipReader 是 Qt 中用于从 .zip 文件中读取和提取文件内容的类。它提供了便捷的方法来访问压缩包中的文件和目录&#xff0c;并允许你解压缩单个或多个文件。通过 QZipReader&#xff0c;你可以以编程方式读取 .zip 文件中的内容&#xff0c;并提取它们到目标目录中。…

html + css 淘宝网实战

之前有小伙伴说&#xff0c;淘宝那么牛逼你会写代码&#xff0c;能帮我做一个一样的淘宝网站吗&#xff0c;好呀&#xff0c;看我接下来如何给你做一个淘宝首页。hahh,开个玩笑。。。学习而已。 在进行html css编写之前 先了解下网页的组成和网页元素的尺寸吧 1.网页的组成 …

Ollama+OpenWebUI+llama3本地部署

引言 llama3在4月19日刚刚发布&#xff0c;官方的对比结果中在开源模型中堪称世界第一&#xff0c;整好周六日有时间&#xff0c;在魔搭社区上测试一下 2 安装Ollama 2.1 下载Ollama 登录Ollama官网下载Ollama安装包 GitHub&#xff1a;https://github.com/ollama/ollama?t…

【vue2父组件调用子组件方法之slot的使用】

父组件调用子组件方法之slot的使用 具体功能需求&#xff1a; 一个页面&#xff0c;点击按钮&#xff0c;打开一个弹窗。弹窗有自定义表单和公共表单&#xff0c;提交的时候要获取两个表单的数据以及复显表单数据 为什么使用插槽了&#xff0c;因为我需要在弹窗中复用公共表单…

【HarmonyOS】鸿蒙将资源文件夹Resource-RawFile下的文件存放到沙箱目录下

【HarmonyOS】鸿蒙将资源文件夹Resource-RawFile下的文件存放到沙箱目录下 一、问题背景 应用开发中&#xff0c;我们经常会遇到一些文件原先是放在资源文件夹 rawfile下&#xff0c;但是逻辑处理时&#xff0c;需要转移到本地沙箱才能操作。这种情况下&#xff0c;就需要将将…

ubuntu 网络管理--NetworkManager

ubuntu 网络管理--NetworkManager 1 介绍2 NetworkManager 命令2 nmcli 命令显示可用的wifi AP连接wifi检查网络连接 ?? 如何删除删除网络连接查看设备状态添加一个新的以太网连接设置静态 IP 地址启用并测试连接添加新的wifi连接 3 其他命令参考 1 介绍 NetworkManager 是标…

Unity功能模块一对话系统(1)前置准备

也许你也曾被游戏中的对话系统深深吸引&#xff0c;那些精心设计的对白、鲜活的角色配音、甚至是简单的文字对话&#xff0c;往往能让玩家产生强烈的代入感和情感共鸣。如果你正在开发一款游戏&#xff0c;或者计划为你的项目加入一个引人入胜的对话系统&#xff0c;那么 Unity…

【自留】Unity VR入门

帮老师写的&#xff0c;自留&#xff0c;不保证是很好的教程。 1.PICO开发指南&#xff08;官方&#xff09; 在该页面&#xff0c;能找到大部分能实现的功能&#xff0c;以及实现方式。非常推荐&#xff01;PICO Unity Integration SDK | PICO 开发者平台 2.如何快速入门&…