GO性能优化|青训营

134 阅读1分钟

这是我参与「第六届青训营」伴学笔记创作活动的第 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程序性能的优化,一个好的程序是可以做到尽量小地优化、不占用内存的,希望这对今后在编写程序中起到很大的帮助。