golang:最佳排序和连接字符串

时间:2017-01-02 08:09:18

标签: string memory-management go slice

go的源代码中的

This简短方法有一条注释,暗示它没有以最佳方式分配内存。

  

......在这里可以做更好的分配......

ThisJoin方法的源代码。

这里的低效分配究竟是什么?我没有看到分配源字符串切片和目标字节切片的方法。源是切片的关键。目标是字节切片。

1 个答案:

答案 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

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)