返回顶部
首页 > 资讯 > 精选 >如何简单高效的Go struct优化
  • 537
分享到

如何简单高效的Go struct优化

2023-07-05 09:07:31 537人浏览 安东尼
摘要

本文小编为大家详细介绍“如何简单高效的Go struct优化”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何简单高效的Go struct优化”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先

本文小编为大家详细介绍“如何简单高效的Go struct优化”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何简单高效的Go struct优化”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

先来看个例子

下面定义两个结构体,字段都一样,只是部分字段稍微调整了一下顺序。

但输出的结果,为什么bad占用24字节,而good却只占用16字节呢?一个顺序调整就节省了8个字节,太神奇了

type BadSt struct {  A int32  B int64  C bool}type GoodSt struct {  A int32  C bool  B int64}func main() {  bad := BadSt{A: 10, B: 20, C: false}  fmt.Println(unsafe.Sizeof(bad))  good := GoodSt{A: 10, B: 20, C: false}  fmt.Println(unsafe.Sizeof(good))}//输出结果://24//16

想要解开这个问题,我们得先来学习一下内存对齐机制,然后再来进一步分析

内存对齐机制

  • 基本概念

为了能让CPU可以更快的存储与读取到各个字段,Go编译器会帮我们把结构体做数据的对齐。所谓的数据对齐,是指内存地址是所存储数据大小的整数倍(按字节为单位),以便CPU可以一次将该数据从内存中读取出来,减少了读取次数。编译器通过在结构体的各个字段之间填充一些空白已达到对齐的目的

  • CPU访问内存

CPU 访问内存时,并不是逐个字节访问,而是以机器字(word)为单位进行访问。比如 64位CPU的字长(Word size)为8bytes,那么CPU访问内存的单位也是8字节,每次加载的内存数据也是固定的若干字长,如8words(64bytes)、16words(128bytes)等

  • 对齐系数

不同硬件平台占用的大小和对齐值都可能是不一样的,每个特定平台上的编译器都有自己的默认"对齐系数",32位系统对齐系数是4,64位系统对齐系数是8

不同类型的对齐系数也可能不一样,使用Go语言中的unsafe.Alignof函数可以返回相应类型的对齐系数,对齐系数都符合2^n这个规律,最大也不会超过8

func main() {  fmt.Printf("bool:   %d\n", unsafe.Alignof(bool(true)))  fmt.Printf("string: %d\n", unsafe.Alignof(string("a")))  fmt.Printf("int:    %d\n", unsafe.Alignof(int(0)))  fmt.Printf("int32:  %d\n", unsafe.Alignof(int32(0)))  fmt.Printf("int64:  %d\n", unsafe.Alignof(int64(0)))  fmt.Printf("float64:  %d\n", unsafe.Alignof(float64(0)))  fmt.Printf("float32:%d\n", unsafe.Alignof(float32(0)))}//输出结果://bool:   1//string: 8//int:    8//int32:  4//int64:  8//float64:8//float32:4
  • 对齐原则

  • 结构体变量中成员的偏移量必须是成员大小的整数倍

  • 整个结构体的内存大小必须是最大字节的整数倍(结构体的内存占用是1/4/8/16byte…)

案例进一步分析

  • BadSt结构体,占用24个字节

如何简单高效的Go struct优化

type BadSt struct {  A int32  B int64  C bool}

分析过程:

  • 字段A 4字节:先计算偏移量,最开头下标为0,0%4=0,正好整除,先占用4个字节;

  • 字段B 8字节:下标4-7,对8都不能整除,则填充空白,下标8可以整除,所以下标8-15 8个字节为字段B的存储使用;

  • 字段C 1字节:下标16,对1可以整除,所以下标16则用作字段C的存储;

  • 最后,该结构体字段最大字节为8且目前已占用17字节,要保证是整数倍,所以最后面需要填充7个字节,占满24字节,才能满足条件(对齐原则2)。

  • GoodSt结构体,占用16个字节

如何简单高效的Go struct优化

type GoodSt struct {  A int32  C bool  B int64}

分析过程:

  • 字段A 4字节:先计算偏移量,最开头下标为0,0%4=0,正好整除,先占用4个字节;

  • 字段C 1字节:下标4,对1可以整除,所以下标4则用作字段C的存储;

  • 字段B 8字节:下标5-7,对8都不能整除,则填充空白,下标8可以整除,所以下标8-15 8个字节为字段B的存储使用;

  • 最后,该结构体字段最大字节为8且目前已占用16字节,正好是整数倍,所以后面不再需要填充空白了。

读到这里,这篇“如何简单高效的Go struct优化”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何简单高效的Go struct优化

本文链接: https://lsjlt.com/news/350909.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何简单高效的Go struct优化
    本文小编为大家详细介绍“如何简单高效的Go struct优化”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何简单高效的Go struct优化”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先...
    99+
    2023-07-05
  • 详解简单高效的Go struct优化
    目录前言先来看个例子内存对齐机制案例进一步分析总结前言 结构体的定义,大家都很熟悉,但想要定义出更节省内存空间的结构体,可不是一件简单的事。 我们必须掌握了Go的结构体内存对齐机制...
    99+
    2023-03-06
    Go struct优化 Go struct
  • go sync.Once如何实现高效单例模式
    这篇文章主要讲解了“go sync.Once如何实现高效单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go sync.Once如何实现高效单例模式”吧!基本实现1...
    99+
    2023-07-05
  • JavaScript 代码优化秘籍:如何让你的代码更简洁、更高效
    作为一名 JavaScript 开发人员,优化代码是至关重要的。优化代码可以提高性能、可读性和可维护性。本文将分享一些常用的 JavaScript 代码优化技巧,帮助您写出更优质的代码。 1. 使用严格模式 严格模式可以帮助您发现代码中...
    99+
    2024-02-27
    JavaScript 代码优化、性能、可读性、可维护性、代码质量
  • Go 语言编写 API 文件,如何优化算法提高效率?
    随着互联网技术的快速发展,越来越多的企业开始重视开放 API,将自身服务向外部开放,以实现更好的服务交互和数据共享。而 API 文件作为开放 API 的一部分,对于 API 的使用者来说,是非常重要的参考文档。因此,如何编写高质量的 AP...
    99+
    2023-06-24
    api 文件 编程算法
  • 感受Go语言的优雅魅力:简便、灵活、高效
    体验Golang简洁之美:简单、灵活、高效 Go语言(Golang)是一门由Google开发的开源编程语言,被设计为令人愉悦、高效、快速的编程语言。Golang因其简洁、灵活、高效的特...
    99+
    2024-02-25
    golang 高效 简洁 go语言 网络编程 标准库
  • Go语言如何通过优化数据结构提高高并发场景下的效率?
    在高并发场景中优化go语言数据结构以提升效率:使用并发安全的数据结构:sync.mutex、sync.map、sync.waitgroup选择合适的数据结构:频繁读写的线性结构(map、...
    99+
    2024-05-10
    git golang go语言 键值对
  • 如何编写高效的php性能优化函数?
    PHP是一种广泛使用的服务器端脚本语言,但由于它的解释执行和动态类型等特性,可能会导致一些性能问题。为了提高PHP脚本的性能,我们可以编写一些高效的PHP性能优化函数。本文将介绍如何编写这样的函数,并给出具体的代码示例。使用合适的数据结构选...
    99+
    2023-10-21
    PHP性能优化 高效编写 函数优化
  • 如何使用Go语言进行高效的内存优化和垃圾回收
    使用Go语言进行高效的内存优化和垃圾回收有以下几个方面的技巧和建议:1. 减少内存分配:避免频繁的对象创建和销毁操作,尽量重用已有的...
    99+
    2023-10-12
    Go语言
  • 如何通过优化程序性能来提高Go语言程序的效率
    随着互联网技术的发展,我们的应用程序需要不断地追求更好的性能和效率,特别是在高并发、大数据等场景下,Go语言逐渐成为了开发高效程序的首选语言。但是,随着程序规模逐渐扩大,会面临着性能瓶颈的问题。为了解决这个问题,接下来我们将深入讨论如何通过...
    99+
    2023-05-14
  • Go和Django:如何优化接口文件以提高应用程序的效率?
    在现代Web开发中,应用程序的效率是至关重要的。一些开发者选择使用Go和Django这样的框架来实现高效的Web应用程序。但即使使用这些框架,程序的效率也取决于开发者如何优化其代码。在这篇文章中,我们将讨论如何通过优化接口文件来提高Web...
    99+
    2023-08-25
    django 接口 文件
  • 精简高效的C#网站优化经验技巧总结
    对大型网站,技术涉及面非常广,对硬件,软件,编程语言,Web Service,防火墙等等有很高要求。 面对大量用户,高并发请求,可以使用高性能服务器,高性能编程语言,高性能数据库,加...
    99+
    2024-04-02
  • 如何在 Go 中优化容器性能以实现更高效的编程算法?
    在当今软件开发领域,容器化技术正在迅速发展。而 Go 作为一门快速、安全、高效的编程语言,自然也成为了容器化技术的重要组成部分。但是,如果我们想要在 Go 中实现高效的编程算法,就需要优化容器的性能。本文将介绍如何在 Go 中优化容器性能,...
    99+
    2023-07-02
    数据类型 编程算法 容器
  • 10种简单的Java性能优化
    最近“全网域(Web Scale)”一词被炒得火热,人们也正在通过扩展他们的应用程序架构来使他们的系统变得更加“全网域”。但是究竟什么是全网域?或者说如何确保全网域?扩展的不同方面全网域被炒作的最多的是扩展负载(Scaling load),...
    99+
    2023-05-30
    java 性能优化 ava
  • 如何简单高效的搭建Linux系统日志服务器
    本篇文章给大家分享的是有关如何简单高效的搭建Linux系统日志服务器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。日志服务器就是把若干台服务器的日志信息 统一写入到某一台里面,...
    99+
    2023-06-28
  • 如何利用Go语言进行内存优化和高效的垃圾回收管理
    要利用Go语言进行内存优化和高效的垃圾回收管理,可以采取以下几个策略:1. 使用指针:Go语言通过指针进行内存管理,使用指针可以减少...
    99+
    2023-10-08
    Golang
  • Golang开发建议:如何进行高效的性能调优和优化
    Golang开发建议:如何进行高效的性能调优和优化随着互联网和大数据时代的到来,软件的性能要求也越来越高。作为一种快速、高效、并发性好的编程语言,Golang在构建高性能应用程序方面表现出色。然而,即使使用了Golang,也不意味着就能够轻...
    99+
    2023-11-22
    优化 Golang 性能调优
  • 如何用go struct查看json的标签键?
    问题内容 我正在学习https://www.digitalocean.com/community/tutorials/how-to-use-json-in-go#using-a-str...
    99+
    2024-02-13
  • Go语言的存储优化技巧:如何在编程中实现高效的数据存储?
    在软件开发中,数据存储是一个非常重要的环节。数据存储的效率不仅关系到程序的性能,还会直接影响到用户体验。因此,如何在编程中实现高效的数据存储是一个非常关键的问题。本文将介绍一些Go语言的存储优化技巧,帮助你在编程中实现高效的数据存储。 一...
    99+
    2023-10-04
    存储 编程算法 大数据
  • 实践中如何优化Go语言输入函数的效率
    标题:实践中如何优化Go语言输入函数的效率 在日常的Go语言开发工作中,输入函数的效率往往影响着整个程序的性能。本文将介绍如何在实践中优化Go语言输入函数的效率,通过具体的代码示例讲解...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作