Skip to content

Latest commit

 

History

History
35 lines (21 loc) · 1.81 KB

bufio.md

File metadata and controls

35 lines (21 loc) · 1.81 KB

bufio

bufio通过缓存来提高效率,缓存放在主存中。

缓冲原理

为什么bufio性能会比io性能要高呢?

以缓存读为例,当设置好缓冲区大小以及读取字节数和缓冲字节数后。

  • 若缓冲区为空,同时读取字节数大于等于缓冲字节数,则直接从文件中读取,即不启用缓冲。
  • 若缓冲区为空,同时读取字节数小于缓冲区字节数,则从文件中读取缓冲区字节内容到缓冲区后,程序再从缓冲区中读取内容,此时缓冲区大小会等于缓冲区大小减去缓冲区字节数。
  • 若缓冲区不为空,同时读取字节数小于缓冲字节数,则会从缓冲区读取内容,此时不会发生文件I/O。
  • 若缓冲区不为空,同时读取字节数大于等于缓冲字节数,则会置空缓冲区,重新读取。

image

FAQ

bufio比io性能要高

当频繁地对少量数据读写时会占用IO,造成性能问题。golang的 bufio 库使用缓存来一次性进行大块数据的读写,以此降低IO系统调用,提升性能。

  • 优点:针对rpc微服务场景,很多小包,采用bufio组件后,减少IO读写次数,性能至少提升1倍。-- 节约了cpu,memory影响还好,因为一个链接多开辟了4k内存。(4k可配置)
    • 【对比分析】
      • 读:之前读取1帧数据,io读帧头,帧体 共计2次;-- 现在基本会被bufio合并为1次读。
      • 写:写也跟读一样。

当然,使用bufio后,对开发者的要求更高,不要用错了,特别是只能基础平台,出现bug,就会影响比较大。

善于使用优秀的第3方插件也是一种能力。

参考链接