2017-01-02 2 views
0

This Die kurze Methode im Quellcode von go hat einen Kommentar, der besagt, dass der Speicher nicht optimal zugeordnet wird.golang: optimale Sortierung und Verknüpfung von Strings

... tun könnte hier bessere Verteilung weisen ...

This ist der Quellcode für die Join Methode.

Was genau ist hier ineffizient zugeordnet? Ich sehe keinen Weg, den Source-String-Slice und den Ziel-Byte-Slice zuzuordnen. Die Quelle ist das Teil der Schlüssel. Das Ziel ist die Scheibe von Bytes.

+0

Bezieht sich nicht auf den Link speziell, aber 'strings.Join()' tut viel Zuteilung und Kopieren für die Verkettung. Bei großen Strings kann dies im Vergleich zu anderen Ansätzen wie Buffer/'io.Writer' teuer sein. – Nadh

Antwort

1

Die code referenced by the comment ist wie geschrieben sparsam. Alle Zuweisungen sind in strings.Join, die geschrieben wird, um Speicherzuweisungen zu minimieren.

Ich vermute, dass der Kommentar wurde versehentlich aus diesem code in the net/http package kopiert und eingefügt:

 // 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 
     } 

Dieser Code-Schnipsel hat die folgenden möglichen Zuordnungen:

Ein Speicher effizienter Ansatz ist es, einen einzigen []byte für die Daten zuzuordnen geschrieben werden.

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) 
Verwandte Themen