Go语言特性和性能调优
协程——Goroutine
线程与协程
- 属于内核态,占用栈大小为MB级别。由于是内核态,因此多个线程可以交由操作系统进行调度进而分配到不同的处理器上并行运行。
- 属于用户态,占用栈大小为KB级别。由于是用户态,因此多个协程无法发挥操作系统的调度优势,但是开销较小,因此与线程相比在资源相同的情况下可以支持更多的并发协程。
协程通信与共享内存
提倡借助通信实现共享内存,而非共享内存实现通信。因为共享内存实现通信时有很多并发控制问题,需要借助锁、信号量等工具来解决,而两者会占用一部分处理器时间进而造成资源浪费。
通信方式——管道(Channel)
无缓冲管道
- 特点: 没有缓冲区,因此输入的数据将直接从管道输出。
- 创建方式: make(chan int)
有缓冲管道
- 特点: 有缓冲区,因此支持数据缓存。
- 创建方式: make(chan int, 2)
同步
- 同步库sync
- 同步库中包含锁类型sync.Mutex,在需要加锁的地方使用.Lock(),使用完通过.Unlock()解锁。
- 协程同步工具WaitGroup,Add(delta int)将计数器添加delta,Done()将计数器减1,Wait()阻塞直到计数器为0。
Go依赖管理
第一代依赖管理——Go PATH
Go PATH目录下包含bin(二进制文件)、pkg(编译中间产物)、src(项目源码)三个文件夹。 问题: 对两个项目A和B,A依赖于一个包的v1版本,B依赖于一个包的v2版本,即项目依赖不同包,那么会产生版本冲突。
第二代依赖管理——Go Vendor
项目目录下添加vendor文件,存放包的各个副本,进而解决了项目依赖不同包的问题。 问题: 若A项目中的B包依赖于D包的v1,C包依赖于D包的v2,D包两版本若不兼容,那么B和C包会产生依赖冲突,即包依赖冲突。
第三代依赖管理——Go Module
go.mod
- 语义化版本语法:${MAJOR}.${MINOR}.${PATCH} 例:V1.3.0
- commit版本语法:${MAJOR}.${MINOR}.${PATCH}-yyyymmddhhmmss-${校验码}
- 间接依赖: 版本号后添加 //indirect
- 不兼容符号: 版本号后添加 incompatible
依赖分发-Proxy
proxy1 -> proxy2 -> direct url
go get
go get $pkg $param
param = @update:默认 @none:依赖 @v1.1.2:tag版本,语义版本 @23dfdd5:特定commit
go mod
go mod $param
param = init:初始化 download:下载 tidy:增加需要依赖,删除不需要依赖
测试
- 回归测试
- 集成测试
- 单元测试
-
- File
-
- DB
-
- Cache
-
- Mock(幂等,稳定)
- 基准测试
性能优化建议
Benchmark
返回结果包括:
- 函数名
- 执行次数
- 每次执行花费时间
- 每次执行申请内存大小
- 每次执行申请内存次数
Slice
- 初始化时尽量指定容量大小,减少扩容造成的系统调用。
- 在大切片基础上创建新切片时可以选用copy新建一块新内存,因为此时原切片内存不会释放造成内存占用。
Map
- 初始化时也建议尽量初始化容量。
- 用空结构体struct{}作为value值可以节省内存。
字符串
- 性能拼接最差,strings.Build和bytes.Buffer相近,strings.Buffer更快。
atomic包
- 通过硬件实现,效率比加锁高。
- 比较适合简单的小操作,而锁更适用于保护一段逻辑。
- 非数值操作可以使用atomic.Value,承载一个interface{}。
性能优化实战
pprof
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbajbk
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13