磁盘:1.寻址:ms(毫秒) 2.磁盘带宽[1]:MB/s
内存:1.寻址:ns(纳秒) 2. 内存带宽[2]:GB/s
磁盘比内存在寻址上慢了10W倍,传输带宽上慢了20倍 。
开源的带缓冲区的logrus日志写入hook[3],就利用了bufio技术 。
// 利用bufio针对原始io.Writer封装成带缓冲区的io.Writer`s.writer = bufio.NewWriterSize(s.Writer, size)......if len(bs) > s.writer.Available() && s.writer.Buffered() > 0 {if err := s.writer.Flush(); err != nil {return err}}_, err = s.writer.Write(bs)`
优化总结
- sync.Pool 复用临时对象,减少内存分配和gc次数
- bufio利用缓冲区,减少笨重的系统调用
- 其实就是“降本增效”的体现 。
[2] 内存带宽: https://baike.baidu.com/item/内存带宽
[3] 带缓冲区的logrus日志写入hook: https://Github.com/zwbdzb/logrus-bufferedWriter-hook
推荐阅读
- golang反射实现原理
- Golang中如何判断两个Slice是否相等?
- 使用Golang构建一万+每秒处理请求的高性能系统
- 一文彻底弄明白Golang获取各种路径问题
- 带你使用Golang快速构建出命令行应用程序
- golang分离加载shellcode实现免杀