极客兔兔博客笔记-GO语言高性能编程-常用数据结构
2021/8/17 22:06:14
本文主要是介绍极客兔兔博客笔记-GO语言高性能编程-常用数据结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
参考博客:极客兔兔
字符串拼接方法的比较
- strings.Builder和+
func builderConcat(n int,str string) string { var builder strings.Builder for i := 0;i<n;i++{ builder.WriteString(str) } return builder.String() }
当时用+拼接2个字符串时候是开辟一段新的空间。而strings.Builder,bytes.Buffer,包括切片的[]byte的内存是以倍数申请的。当一万个字符串拼接时,strings.Builder方法的内存消耗大概是+的内存消耗的千分之一。
slice的性能及陷阱
当silce的容量较小时内存是以2的倍数扩大的,当达到2048时采用新的策略,避免内存申请过大,导致浪费。
切片的结构:
struct { ptr *[]T len int cap int }
性能缺陷:在已有切片的基础上进行切片,不会创建新的底层数组,因为原来的底层数据没有发生变化,内存会一直占用,直到没有变量引用该数组。推荐:用copy
代替re-slice //[x:x]
。
当copy时,切片创建一个新的底层切片,当原切片的底层数组没有引用时内存就会被GC。
for和range的性能比较
range可以很方便地去遍历数组、切片、字典和信道。对nil类型,迭代次数为0。对于通道,for循环迭代直到通道被关闭。
仅遍历下标时for和range性能几乎一样,同时遍历下标和值,for的性能大约是range的2000倍。
range 在迭代过程中返回的是迭代值的拷贝,如果每次迭代的元素的内存占用很低,那么 for 和 range 的性能几乎是一样,例如 []int
。但是如果迭代的元素内存占用较高,例如一个包含很多属性的 struct 结构体,那么 for 的性能将显著地高于 range,有时候甚至会有上千倍的性能差异。对于这种场景,建议使用 for,如果使用range,建议只迭代下标,通过下标访问迭代值,这种使用方式和 for 就没有区别了。如果想使用 range 同时迭代下标和值,则需要将切片/数组的元素改为指针,才能不影响性能。
Go空结构体struct{}的使用
unsafe.Sizeof
可以得到一个数据类型实例所需要占用的字节数。
空结构体不占据内存空间,因此可以广泛作为各种场景下面的占位符。
有时候使用 channel 不需要发送任何的数据,只用来通知子协程(goroutine)执行任务,或只用来控制协程并发度。这种情况下,使用空结构体作为占位符就非常合适了。
这篇关于极客兔兔博客笔记-GO语言高性能编程-常用数据结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享
- 2024-12-10搭建个人博客网站之一、使用hugo创建个人博客网站