bufio通过缓存来提高效率,缓存放在主存中。
为什么bufio性能会比io性能要高呢?
以缓存读为例,当设置好缓冲区大小以及读取字节数和缓冲字节数后。
- 若缓冲区为空,同时读取字节数大于等于缓冲字节数,则直接从文件中读取,即不启用缓冲。
- 若缓冲区为空,同时读取字节数小于缓冲区字节数,则从文件中读取缓冲区字节内容到缓冲区后,程序再从缓冲区中读取内容,此时缓冲区大小会等于缓冲区大小减去缓冲区字节数。
- 若缓冲区不为空,同时读取字节数小于缓冲字节数,则会从缓冲区读取内容,此时不会发生文件I/O。
- 若缓冲区不为空,同时读取字节数大于等于缓冲字节数,则会置空缓冲区,重新读取。
当频繁地对少量数据读写时会占用IO,造成性能问题。golang的 bufio 库使用缓存来一次性进行大块数据的读写,以此降低IO系统调用,提升性能。
- 优点:针对rpc微服务场景,很多小包,采用bufio组件后,减少IO读写次数,性能至少提升1倍。-- 节约了cpu,memory影响还好,因为一个链接多开辟了4k内存。(4k可配置)
- 【对比分析】
- 读:之前读取1帧数据,io读帧头,帧体 共计2次;-- 现在基本会被bufio合并为1次读。
- 写:写也跟读一样。
- 【对比分析】
当然,使用bufio后,对开发者的要求更高,不要用错了,特别是只能基础平台,出现bug,就会影响比较大。