当前位置:首页 > 科技  > 软件

Golang数据结构性能优化实践

来源: 责编: 时间:2024-01-02 09:30:41 294观看
导读如果你有Golang开发经验,一定定义过struct类型。但可能你不知道,通过简单的重新排序struct字段,可以极大提高Go程序的速度和内存使用效率!是不是难以置信?我们一起来看一下吧!简单Demotype BadStruct struct { age

如果你有Golang开发经验,一定定义过struct类型。qX528资讯网——每日最新资讯28at.com

但可能你不知道,通过简单的重新排序struct字段,可以极大提高Go程序的速度和内存使用效率!qX528资讯网——每日最新资讯28at.com

是不是难以置信?我们一起来看一下吧!qX528资讯网——每日最新资讯28at.com

qX528资讯网——每日最新资讯28at.com

简单Demo

type BadStruct struct { age         uint8 passportNum uint64 siblings    uint16}type GoodStruct struct { age         uint8 siblings    uint16 passportNum uint64}

在上面的代码片段中,我们创建了两个具有相同字段的结构体。然后编写一个简单程序分别输出其内存使用情况。qX528资讯网——每日最新资讯28at.com

// OutputBad struct is 24 bytes longGood struct is 16 bytes long

如你所见,它们在内存使用方面并不一样。qX528资讯网——每日最新资讯28at.com

是什么原因导致两个完全相似的struct消耗的内存不同?qX528资讯网——每日最新资讯28at.com

答案在于数据在计算机内存中的排列方式。qX528资讯网——每日最新资讯28at.com

简而言之,数据结构对齐。qX528资讯网——每日最新资讯28at.com

数据结构对齐

CPU以字(word)为单位读取数据,而不是字节(byte)。qX528资讯网——每日最新资讯28at.com

64位系统中,一个word是8个字节,而32位系统中,一个word是4个字节。qX528资讯网——每日最新资讯28at.com

简而言之,CPU以其字长的倍数读取内存地址。qX528资讯网——每日最新资讯28at.com

qX528资讯网——每日最新资讯28at.com

想象一下,在64位系统中,为了获取变量passportNum,CPU需要两个周期来访问数据。qX528资讯网——每日最新资讯28at.com

第一个周期将获取内存的0到7字节,下一个周期获取其余内存字节。qX528资讯网——每日最新资讯28at.com

把它想象成一个笔记本,每页只能存储一个字大小的数据(在本例中为8字节)。如果passportNum分散在两个页,则需要两次读取才能检索到完整的数据。qX528资讯网——每日最新资讯28at.com

非常低效。qX528资讯网——每日最新资讯28at.com

因此需要数据结构对齐,让计算机将数据存储在等于数据大小倍数的地址上。qX528资讯网——每日最新资讯28at.com

qX528资讯网——每日最新资讯28at.com

4字节数据只能从内存地址0或4开始qX528资讯网——每日最新资讯28at.com

例如,2字节数据可以存储在内存0、2或4中,而4字节数据可以存储在内存0、4或8中。qX528资讯网——每日最新资讯28at.com

qX528资讯网——每日最新资讯28at.com

通过简单的对齐数据,计算机确保可以在一个CPU周期内检索到变量passportNum。qX528资讯网——每日最新资讯28at.com

数据结构填充

填充是实现数据对齐的关键。qX528资讯网——每日最新资讯28at.com

计算机通过在数据结构之间填充额外的字节,从而对齐字段。qX528资讯网——每日最新资讯28at.com

这就是额外内存的来源!qX528资讯网——每日最新资讯28at.com

我们来回顾一下BadStruct和GoodStruct。qX528资讯网——每日最新资讯28at.com

qX528资讯网——每日最新资讯28at.com

GoodStruct消耗更少的内存,仅仅因为与BadStruct相比,其struct字段顺序更合理。qX528资讯网——每日最新资讯28at.com

由于填充,两个13字节的数据结构分别变成了16字节和24字节。qX528资讯网——每日最新资讯28at.com

因此,可以仅仅通过对struct字段重新排序来节省额外的内存!qX528资讯网——每日最新资讯28at.com

这种优化为什么重要?

问题来了,你为什么要关心这个?qX528资讯网——每日最新资讯28at.com

两个方面,速度和内存使用。qX528资讯网——每日最新资讯28at.com

我们做一个简单的基准测试来证明!qX528资讯网——每日最新资讯28at.com

func traverseGoodStruct() uint16 { var arbitraryNum uint16   for _, goodStruct := range GoodStructArr {  arbitraryNum += goodStruct.siblings }   return arbitraryNum}func traverseBadStruct() uint16 { var arbitraryNum uint16   for _, badStruct := range BadStructArr {  arbitraryNum += badStruct.siblings }   return arbitraryNum}func BenchmarkTraverseGoodStruct(b *testing.B) { for n := 0; n < b.N; n++ {  traverseGoodStruct() }}func BenchmarkTraverseBadStruct(b *testing.B) { for n := 0; n < b.N; n++ {  traverseBadStruct() }}

对GoodStruct和BadStruct进行基准测试的方法是循环遍历数组,并将struct字段累加到变量中。qX528资讯网——每日最新资讯28at.com

qX528资讯网——每日最新资讯28at.com

从结果中可以看出,遍历GoodStruct确实比BadStruct花费时间更少。qX528资讯网——每日最新资讯28at.com

对struct字段重排序可以优化应用程序的内存使用和速度。qX528资讯网——每日最新资讯28at.com

想象一下,维护一个具有大量结构体的大型应用程序,改变将会更为明显。qX528资讯网——每日最新资讯28at.com

结语

好了,全文到此为止,我们以一个简单的行动呼吁来结束:一定要对struct结构字段进行重排序!qX528资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-55105-0.htmlGolang数据结构性能优化实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Go语言中的性能考虑和优化

下一篇: “推荐大战:抖音vs.快手”——背后的秘密全揭晓!

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 自动化在DevOps中的力量:简化软件开发和交付

    自动化在DevOps中扮演着重要角色,它提升了DevOps的效能。通过自动化工具和方法,DevOps团队可以实现以下目标:消除手动和重复性任务。简化流程。在整个软件开发生命周期中实现更
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • 微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
Top