memory-management - bytes.Buffer 是否执行大量重新分配?

标签 memory-management go

我想做的是有一个 io.MultiWriter 写入标准输出和字节缓冲区。像这样的事情:

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())
}

我想知道我这样做是否是在搬起石头砸自己的脚?这是否会为每次插入重新分配数组?如果是这样,也许有更好的方法?我是否过早地进行了优化?

最佳答案

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

bytes.Buffer 类型的增长与 slice 类似。因此,每当进入缓冲区的数据超过当前 byte slice 的容量时,缓冲区(内部是一个 byte slice )就会加倍。然后,将旧 slice 中的数据复制到新 slice ,然后将新数据附加到其中。

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

关于memory-management - bytes.Buffer 是否执行大量重新分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38356480/

相关文章:

c++ - 为什么要明确调用 operator new

types - golang 在 switch 中动态创建接收器

go - 为什么在 Go 中调用嵌入字段的方法时类型别名和类型的行为不同?

go - 在 Golang 中将结构转换为映射的函数

c - 在C中为结构中的数组分配顺序内存地址

iphone - 以编程方式清除 iPhone 上的二级缓存

scala - Akka Actor内存泄漏或管理

c++ - 在结构中释放 gsl vector

go - 如何在 Golang 中使用 HTTP/2 写入/读取/发送数据帧?

golang 仅在作者进行更改时才阻止读者