假设你在谈论IO:
想象一下,你有一个var fin *os.File包含在缓冲区中的文件var instrm *bufio.Reader.现在假设您正在编写某种解析器,一次读取输入的一个字符(比如说字节).包bufio实现缓冲I/O.
如果你打电话,myParser.Parse(fin)你会拨打.Read4,194,304次来读取每个字节,这将使系统调用4,194,304次,这将导致4,194,304个上下文切换.上下文切换是控制从用户空间程序转移到OS并且是最慢(非IO)操作之一.在操作系统没有合并/预取IO请求的情况下,您的IO设备一直在寻找和读取一个字节的可能性很大,但是大多数操作系统的IO电梯,预取和设备端缓冲器都阻止了这一点(但它总是更好地阅读大型连续批次).
如果myParser.Parse(instrm)使用默认bufio.Reader缓冲区为4K进行调用,则会导致1,024个上下文切换(每个系统调用读取4K而不是1个字节).由于每个系统调用都有一些开销,这意味着系统调用花费的时间更少,程序运行的时间更长.值得指出的是,以这种方式运行(没有额外的上下文切换)通常会增加CPU指令缓存命中率,因为在更小的内存区域内将花费更多的时间进行分支.
缓冲区在网络IO等领域甚至非常重要,因为它允许您以最大MTU大小发送突发数据包,而不是发送一小撮微小数据包.
只是不要忘记刷新写缓冲区.