bytes.Buffer执行了很多reallocs吗?

时间:2016-07-13 15:55:05

标签: memory-management go

我要做的是有io.MultiWriter写入stdout和字节缓冲区。像这样:

package main

import "bytes"
import "fmt"
import "io"
import "os"

func main() {
    var b bytes.Buffer
    multi := io.MultiWriter(&b, os.Stdout)
    fmt.Fprintf(multi, "each of these strings\n")
    fmt.Fprintf(multi, "might be large\n")
    fmt.Fprintf(multi, "and there are many of them\n")
    fmt.Println(b.String())
}

我想知道的是,如果我这样做是在射击自己吗?这会为每个插入重新分配数组吗?如果是这样,也许有更好的方法?我是否过早地进行了优化?

1 个答案:

答案 0 :(得分:1)

这将是写入字节缓冲区的标准方法。

bytes.Buffer类型与切片类似。因此,每次进入它的数据超过当前字节片的容量时,内部为字节片的缓冲器会加倍。然后将旧切片中的数据复制到此新切片,然后将新数据附加到该切片上。

此算法平均在恒定时间内执行(摊销),因此不存在重大的性能损失。