2017-01-02 1 views
0

This go 소스 코드의 short 메소드에는 메모리를 최적의 방법으로 할당하지 않는다는 의미의 주석이 있습니다.golang : 최적의 정렬 및 결합 문자열

은 ... 더 나은 할당을 현명 할 수 ... 여기

This

Join 방법에 대한 소스 코드입니다.

정확하게 여기에 비효율적으로 할당되는 것은 무엇입니까? 소스 문자열 슬라이스와 대상 바이트 슬라이스를 할당하는 방법이 보이지 않습니다. 소스는 키 조각입니다. 바이트의 슬라이스 인 목적지.

+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)