这是我参与「第六届青训营」伴学笔记创作活动的第 5 天,今天学习了性能优化,现在就我学习到的知识进行总结。
本期目录
- 针对网络库的优化
针对网络库的优化
这边介绍两个网络库的优化的例子,go net和net poll:
go net
gnet 是一个基于事件驱动的高性能和轻量级网络框架。它直接使用 epoll 和 kqueue 系统调用而非标准 Go 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:netty 和 libuv,这也使得 gnet 达到了一个远超 Go net 的性能表现。
type Reader interface {
Peek(n int) ([]byte, error)
Discard(n int) (discarded int, err error)
Release() error
Read(b []byte) (int, err error)
}
type Writer interface {
Write(p []byte)
Size() int
Flush() error
}
net poll
golang的底层使用epoll来实现IO复用。netPoll通过pollDesc结构体将文件描述符与底层进行了绑定。netpoll实现了用户层面的与底层网络IO相关的goroutine的阻塞/非阻塞管理。
两者对比如下:
go net
- 流式友好
- 小包性能高
netpoll
- 中大包性能高
- 时延低
总结:通过这次学习我了解了如何进行go程序性能的优化,一个好的程序是可以做到尽量小地优化、不占用内存的,希望这对今后在编写程序中起到很大的帮助。