当前位置: 首页 > news >正文

跟我学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;...
};

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

五、总结

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

相关文章:

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

一、缓存 学习过计算机知识的一般都知道缓存这个概念&#xff0c;大约也知道缓存是什么。但是如果是程序员&#xff0c;如何更好的利用缓存&#xff0c;可能就有很多人不太清楚了。其实缓存的目的非常简单&#xff0c;就是了更高效的操作数据。大家都听说过“局部性原理”&…...

二叉树_堆

目录 一. 树(非线性结构&#xff09; 1.1 树的概念与结构 1.2 树的表示 二. 二叉树 2.1 二叉树的概念与结构 2.2 特殊的二叉树 2.3 二叉树的存储结构 三. 实现顺序结构的二叉树 3.1 堆的概念与结构 一. 树(非线性结构&#xff09; 1.1 树的概念与结构 概念&#xff…...

word文档中有大量空白行删除不掉,怎么办?

现象&#xff1a; 分页之间的空白行太多了&#xff08; 按回车没用。删除也删除不掉 &#xff09; 解决办法&#xff1a; 按ctrl a 全选这个文档右击鼠标&#xff0c;点击【段落】选择【换行和分页】&#xff0c;然后把【分页】里的选项全部勾掉&#xff0c;然后点击【确定】…...

python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django

windows首先安装rabbitmq 点击参考安装 1、环境介绍 Python 3.10.16 其他通过pip安装的版本(Django、pika、celery这几个必须要有最好版本一致) amqp 5.3.1 asgiref 3.8.1 async-timeout 5.0.1 billiard 4.2.1 celery 5.4.0 …...

构建高性能异步任务引擎:FastAPI + Celery + Redis

在现代应用开发中&#xff0c;异步任务处理是一个常见的需求。无论是数据处理、图像生成&#xff0c;还是复杂的计算任务&#xff0c;异步执行都能显著提升系统的响应速度和吞吐量。今天&#xff0c;我们将通过一个实际项目&#xff0c;探索如何使用 FastAPI、Celery 和 Redis …...

永磁同步电机无速度算法--全阶滑模观测器

一、原理介绍 在采用传统滑模观测器求取电机角度时通常存在系统抖振、低通滤波器导致角度相位滞后、角度的求取等问题。针对上述问题&#xff0c;本文采用全阶滑模观测器&#xff0c;该全阶滑模观测器具有二阶低通滤波器的特性&#xff0c;能有效滤除反电动势中的高频噪声&…...

部署开源大模型的硬件配置全面指南

目录 第一章:理解大型模型的硬件需求 1.1 模型部署需求分析 第二章:GPU资源平台 2.1 免费GPU资源 2.1.1 阿里云人工智能PAI 2.1.2 阿里天池实验室 2.1.3 Kaggle 2.1.4 Google Colab 2.2 付费GPU服务 2.2.1 AutoDL 2.2.2 Gpushare Cloud 2.2.3 Featurize 2.2.4 A…...

三、使用langchain搭建RAG:金融问答机器人--检索增强生成

经过前面2节数据准备后&#xff0c;现在来构建检索 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingFaceEmbeddings import os# 定义 Embeddings embeddings HuggingFaceEmbeddings(model_name"m3e-base")#…...

Day13 用Excel表体验梯度下降法

Day13 用Excel表体验梯度下降法 用所学公式创建Excel表 用Excel表体验梯度下降法 详见本Day文章顶部附带资源里的Excel表《梯度下降法》&#xff0c;可以对照表里的单元格公式进行理解&#xff0c;还可以多尝试几次不同的学习率 η \eta η来感受&#xff0c;只需要更改学习率…...

计算机组成原理的学习笔记(5)--数据的表示与运算·其四 浮点数的储存和加减/内存对齐/大端小端

学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记&#xff0c;仅用于学习交流。 1. 浮点数的表示与运算 规格化数&#xff1a; 浮点数的存储格式为 &#xff0c;其中&#xff1a; 为符号位。 为尾数&#xff0c;通常在0和1之间&#xff08;规格化形式为1.xx…...

华为IPD流程6大阶段370个流程活动详解_第二阶段:计划阶段 — 86个活动

华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…...

如何使用 Flask 框架创建简单的 Web 应用?

Flask是一个轻量级的Web应用框架&#xff0c;用Python编写&#xff0c;非常适合快速开发和原型设计。 它提供了必要的工具和技术来构建一个Web应用&#xff0c;同时保持核心简单&#xff0c;不强制使用特定的工具或库。 二、创建第一个Flask应用 安装Flask 首先&#xff0c…...

将Minio设置为Django的默认Storage(django-storages)

这里写自定义目录标题 前置说明静态文件收集静态文件 使用django-storages来使Django集成Minio安装依赖settings.py测试收集静态文件测试媒体文件 前置说明 静态文件 Django默认的Storage是本地&#xff0c;项目中的CSS、图片、JS都是静态文件。一般会将静态文件放到一个单独…...

sed | 一些关于 sed 的笔记

sed 总结 sed 语法sed [-hnV] [-e<script>] [-f<script文件>] [文本文件]--- 参数&#xff1a;-e<script> 以选项中指定的script 来处理输入的文本文件-f<script文件> 以选项中指定的script 文件来处理输入的文本文件-n 禁用 pattern space 的默认输出…...

wtforms+flask_sqlalchemy在flask-admin视图下实现日期的修改与更新

背景&#xff1a; 在flask-admin 的modelview视图下实现自定义视图的表单修改/编辑是件不太那么容易的事情&#xff0c;特别是想不自定义前端view的情况下。 材料&#xff1a; wtformsflask_sqlalchemy 制作&#xff1a; 上代码 1、模型代码 from .exts import db from …...

AI的进阶之路:从机器学习到深度学习的演变(三)

&#xff08;承接上集&#xff1a;AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;二&#xff09;&#xff09; 四、深度学习&#xff08;DL&#xff09;&#xff1a;机器学习的革命性突破 深度学习&#xff08;DL&#xff09;作为机器学习的一个重要分支&am…...

thinkphp 多选框

视图 <div class"form-group"><label for"c-flag" class"control-label col-xs-12 col-sm-2 col-md-4">{:__(Flag)}</label><div class"col-xs-12 col-sm-8 col-md-8"><!--formatter:off--><select …...

机器学习《西瓜书》学习笔记《待续》

如果说&#xff0c;计算机科学是研究关于“算法”的学问&#xff0c;那么机器学习就是研究关于“学习算法”的学问。 目录 绪论引言基本术语 扩展向量的张成-span使用Markdown语法编写数学公式希腊字母的LaTex语法插入一些数学的结构插入定界符插入一些可变大小的符号插入一些函…...

STM32HAL I2C函数

8.5 使用IIC协议读写EEPROM 硬件方式实现 &#xff08;HAL库&#xff09; **HAL_I2C_Mem_Write() :这种方法可以写1个或者多个字节 ** /*** brief 以阻塞模式向指定的内存地址写入数据* param hi2c 指向 I2C_HandleTypeDef 结构体的指针&#xff0c;包含指定 I2C 的配置信息…...

洛谷 P1644 跳马问题 C语言

题目&#xff1a; P1644 跳马问题 - 洛谷 | 计算机科学教育新生态 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 所示。马自左下角 (0,0) 向右上角 (m,n) 跳。规定只能往右跳&#xff0c;不准往左跳。比…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...