This简短方法有一条注释,暗示它没有以最佳方式分配内存。
......在这里可以做更好的分配......
This是Join
方法的源代码。
这里的低效分配究竟是什么?我没有看到分配源字符串切片和目标字节切片的方法。源是切片的关键。目标是字节切片。
答案 0 :(得分:1)
code referenced by the comment编写的内存效率高。任何分配都在strings.Join
中,用于最小化内存分配。
我怀疑该评论是从code in the net/http package:
意外复制并粘贴的 // TODO: could do better allocation-wise here, but trailers are rare,
// so being lazy for now.
if _, err := io.WriteString(w, "Trailer: "+strings.Join(keys, ",")+"\r\n"); err != nil {
return err
}
此代码段具有以下可能的分配:
[]byte
created in strings.Join for constructing the result string
conversion result returned by strings.Join "Trailer: "+strings.Join(keys, ",")+"\r\n"
[]byte
conversion result used in io.WriteString 更高效的内存方法是为要写入的数据分配单个[]byte
。
n := len("Trailer: ") + len("\r\n")
for _, s := range keys {
n += len(s) + 1
}
p := make([]byte, 0, n-1) // subtract 1 for len(keys) - 1 commas
p = append(p, "Trailer: "...)
for i, s := range keys {
if i > 0 {
p = append(p, ',')
}
p = append(p, s...)
}
p = append(p, "\r\n"...)
w.Write(p)