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

Golang数据结构性能优化实践

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

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

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

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

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

简单Demo

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

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

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

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

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

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

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

数据结构对齐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构填充

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

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

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

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

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

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

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

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

这种优化为什么重要?

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

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

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

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

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

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

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

结语

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

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

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

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

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

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top