2017-01-02 8 views
0

This goのソースコードのshortメソッドは、メモリを最適な方法で割り当てていないことを意味するコメントを持っています。golang:最適なソートと文字列の結合

が...ここに良く配分ワイズを行うことができ...

ThisJoinメソッドのソースコードです。

ここでは正確に非効率的に割り当てられるものは何ですか?ソースストリングスライスとデスティネーションバイトスライスを割り当てる方法はありません。ソースはキーのスライスです。宛先はバイトのスライスです。

+0

具体的にリンクを参照するのではなく、 'strings.Join()'は、連結のために多くの割り当てとコピーを行います。大きな文字列の場合、これはBuffer/'io.Writer'のような他のアプローチと比べて高価になります。 – Nadh

答えて

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)