内存分配器性能优化

背景

在之前我们提到采用自定义的内存分配器来解决防止频繁 make 导致的 gc 问题。gc 问题本质上是 CPU 消耗,而内存分配器本身如果产生了大量的 CPU 消耗那就得不偿失。经过测试初代内存分配器实现过于简单,产生了很多 CPU 消耗,因此必须优化内存分配器的性能。

性能消耗原因

在内存的分配和回收上,使用了简单的循环检测,当内存碎片较多的时候,循环消耗非常可观

查找可分配的内存

在这里插入图片描述

找到回收的内存偏移

在这里插入图片描述

性能优化

很快在社区中大家给出了一个称为 Buddy 的内存分片算法,那么这个算法是否能解决问题呢?

Buddy 算法

这是一个非常高效的算法,采用的是满二叉树数据结构,用一个数组来表示,然而当实际使用时却遇到了问题,因为我需要在自研的 BufReader 中使用,因此不能出现内存缝隙。Buffdy 算法在回收内存时只能按照申请什么回收什么的原则。举例,我申请了一个var a []byte = alloc(100),那么回收必须也是回收 free(a)。而自研的 BufReader,需要“部分回收”能力。比如先回收a[50:],然后再回收a[:50]。那么 Buddy 算法将无能为力。
在这里插入图片描述

当然,这个算法最终还会用到,这里先留个悬念。

双圣树模型

这是我自己起的名字,实际上是利用两颗平衡二叉树来实现快速找到可分配的内存以及快速回收内存。

type	Allocator struct {
		pool       []*Block
		sizeTree   *Block
		offsetTree *Block
		Size       int
		// history    []History
	}

分配树

这颗树,用来快速查找可分配的内存,我们将可分配的内存用一个节点表示

type	Block struct {
		Start, End int
		trees      [2]Tree
	}

sizeTree 通过对每个节点的大小(End-Start)进行排序,在分配时,通过查找树中刚好大于等于待分配大小的节点,再修改这个节点,对树进行平衡即可。

回收树

这颗树,用来找到回收内存块前后的 Block,通过合并或者插入 Block 达到回收内存的效果。

合并前面合并后面合并前后仅插入
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

共享节点

由于两棵树只是表达了不同的排序,里面所有节点的数量和属性都是相同的,因此不需要两套节点,只需要公用一套节点集合即可。

type Tree struct {
		left, right *Block
		height      int
	}

每个节点有两套指针,分别指向两棵树的不同的子节点,从而在逻辑上形成了两棵树。

进阶优化

虽然我们最终通过双圣树模型,实现了内存分配器的性能优化,但是优化并没有因此而停止。因为上述的内存分配器是无锁的,只适合给单个 goroutine 使用,如果加锁则性能大打折扣。
那么从宏观角度来说,分配器持有的大内存块也会存在需要回收的情况。比如在流销毁的时候。

再次使用 Buddy 算法

这时候大内存块就不需要部分回收了,此时就又可以采用 Buddy 算法了。我们只需要在申请大内存块时,按照 2 倍数来申请,可以最大化利用。最终我们形成了两级内存分配。当然在这里就需要用锁了。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

果汁机锂电池充电,5V升压12.7V 升压恒压芯片SL1571B

在现代化的日常生活中,果汁机已经逐渐成为了许多家庭厨房的必备电器。随着科技的不断进步,果汁机的性能也在不断提升,其中锂电池的应用更是为果汁机带来了前所未有的便利。而5V升压12.7V升压恒压芯片SL1571B,作为果汁机锂电池充电…

skywalking9.4 链路追踪

下载,很慢很慢很慢!!!! jdk 使用jdk17 skywalking-apm 9.4 java-agent 9.0 idea 本地开发配置 第1行配置按实际来; 第2行自定义,一般和微服务名称相同; 第3行ip写安装的机器ip,端…

QQ音乐绿钻API接口:解锁更多音乐可能性

在我们日常生活中,音乐是不可或缺的一部分。无论是在上班途中,还是在健身房锻炼时,我们都可以通过听音乐来放松自己。然而,在现如今的音乐市场中,有时候我们会觉得收听的歌曲有限,想要尝试更多不同的音乐类…

量产导入 | DFT和ATE概述

什么是DFT DFT(Design for Test),即可测性设计。 一切为了芯片流片后测试所加入的逻辑设计,都叫DFT。 DFT只是为了测试芯片制造过程中有没有缺陷,而不是用来验证芯片功能的,芯片功能的完善应该应该是在芯片开发过程用先进验证方法学去做的。 芯片制造过程相当复杂,工艺缺陷…

降价潮背后:大模型落地门槛真的降了吗?

“比起价格门槛,AI大模型的应用门槛,更难跨越。” 大模型争相降价下,AI应用的门槛真的降低了吗? 答案还真不一定。因为除了价格门槛,AI大模型还有应用门槛。甚至,后者比前者更具挑战性。 B端业务场景向来…

3D感知视觉表示与模型分析:深入探究视觉基础模型的三维意识

在深度学习与大规模预训练的推动下,视觉基础模型展现出了令人印象深刻的泛化能力。这些模型不仅能够对任意图像进行分类、分割和生成,而且它们的中间表示对于其他视觉任务,如检测和分割,同样具有强大的零样本能力。然而&#xff0…

Java集合的组内平均值怎么计算

哈喽,大家好,我是木头左! 在Java中,经常需要对集合进行各种操作,其中之一就是计算集合的组内平均值。本文将介绍如何使用Java集合来计算组内平均值,并提供一些示例代码和实用技巧。 1. 使用Java 8 Stream A…

MMdeploy在cuda+tensorrt下的配置和编译

MMdeploy在cudatensorrt下的配置和编译 Python安装配置MMdeploy配置openmmlab系列从工程安装mmdeploy MMdeploy_runtime以及demo编译安装量化编译runtime和demo Python安装配置MMdeploy 配置openmmlab系列 pip install -U openmim如果mim命令遭遇故障,或者安装失败…

龙迅LT9211D MIPIDSI/CSI桥接到2 PORT LVDS,支持 3840x2160 30Hz分辨率

龙迅LT9211D描述: LT9211D是一款高性能的MIPI DSI/CSI-2到双端口LVDS转换器。LT9211D反序列化输入的MIPI视频数据,解码数据包,并将格式化的视频数据流转换为AP和移动显示面板或摄像机之间的LVDS发射机输出。LT9211D支持最大12.5 dB输入均衡和…

boost asio异步服务器(3)增加发送队列实现全双工通信

增加发送节点 构造发送节点,管理发送数据。发送节点的类如下。 这个发送节点用于保证发送和接收数据的有效性。 增加发送队列 前边实现的是一个简单的echo服务器,也就是服务器将收到的内容发送给对应的客户端。但是在实际的服务器设计中,服务…

《精通ChatGPT:从入门到大师的Prompt指南》第7章:创意写作

第7章:创意写作 7.1 角色设定 角色设定是创意写作中最关键的环节之一。成功的角色设定能够让读者对故事产生共鸣,使故事更加生动有趣。角色不仅仅是情节发展的载体,更是读者情感的投射对象。因此,深入了解如何设定一个生动而有深…

讯方技术与华为终端签署鸿蒙合作协议,将为企业助培百万鸿蒙人才

1月18日,鸿蒙生态千帆启航仪式在深圳举行,华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览面向开发者开放申请,这意味着鸿蒙生态进入第二阶段,将加速千行百业的应用鸿蒙化。讯方技术总裁刘国锋、副总经理刘铭皓应邀出席启航仪式&…

Tessy学习系列(四):组件测试——官方例程interior_light

一、新建工程 (1)新建工程 注意:路径不能包含空格与中文 (2)新建测试集 (3)新建组件测试模块 (4)设置测试模块为组件测试模块 二、导入源码 (1&#xff09…

【ARM Cache 及 MMU 系列文章 6.4 -- Cache miss 统计详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 ARM Cache Miss 统计Cache 多层架构简介Cache 未命中的类型Cache 未命中统计Cache miss 统计代码实现Cache Miss 统计意义ARM Cache Miss 统计 在ARMv8/v9架构中,缓存未命中(Cache …

【wiki知识库】06.文档管理接口的实现--SpringBoot后端部分

目录 一、🔥今日目标 二、🎈SpringBoot部分类的添加 1.调用MybatisGenerator 2.添加DocSaveParam 3.添加DocQueryVo 三、🚆后端新增接口 3.1添加DocController 3.1.1 /all/{ebokId} 3.1.2 /doc/save 3.1.3 /doc/delete/{idStr} …

“盒装”床垫在美国全面爆发,沃尔玛电商正革新传统床上用品行业

​​“盒装”床垫在美国市场的全面普及以及沃尔玛电商对传统床上用品行业的创新,正引领着家居市场的变革潮流。这两个趋势不仅改变了消费者的购物方式,也为整个行业带来了新的发展机遇。 盒装床垫的兴起为消费者带来便捷灵活的购物体验。采用先进压缩技术…

网络流常用示意图及基本概念

【网络流简介】 ● 网络流基本概念网络:网络是一个有向有权图,包含一个源点和一个汇点,没有反平行边。网络流:是定义在网络边集上的一个非负函数,表示边上的流量。网络最大流:在满足容量约束和流量守恒的前…

机器学习-支持向量机

目录 一支持向量机 1.支持向量机SVM 2构建svm目标函数 3.拉格朗日乘法,kkt条件 拉格朗日乘法: kkt条件 对偶问题 4.最小化SVM目标函数 kkt条件: 对偶转换: 5软间隔及优化 优化svm目标函数 构造拉格朗日函数 对偶转换关系…

快手可灵AI开始内测,对标Sora?免费体验!

最近,国内第一个可以和 Sora 相媲美的 AI 视频生成模型,快手的可灵大模型(Kling)开始免费内测。 在快手旗下的快影App,就可以申请。 别忘记填写表格信息,可以加快你的申请通过,链接我放在这里…

超详解——Python 序列详解——基础篇

目录 1. 序列的概念 字符串(String) 列表(List) 元组(Tuple) 2. 标准类型操作符 连接操作符() 重复操作符(*) 索引操作符([]) …