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

Golang数据结构性能优化实践

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

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

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

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

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

简单Demo

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

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

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

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

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

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

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

数据结构对齐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构填充

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

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

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

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

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

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

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

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

这种优化为什么重要?

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

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

我们做一个简单的基准测试来证明!Jl928资讯网——每日最新资讯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字段累加到变量中。Jl928资讯网——每日最新资讯28at.com

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

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

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

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

结语

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

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

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

上一篇: 通过Uri加载raw目录下的文件

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

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • 一篇聊聊Go错误封装机制

    一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 一个注解实现接口幂等,这样才优雅!

    一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 猿辅导与新东方的两种“归途”

    猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • iQOO Neo8系列新品发布会

    iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
  • “买真退假” 这种“羊毛”不能薅

    “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top