코드의 성능에 민감한 몇 가지 섹션에서 할당을 줄이기 위해 버퍼 풀을 사용하는 프로그램이 있습니다. 이 같은슬라이스를 '용량으로 확장하는 가장 간단한 방법은 무엇입니까?
뭔가 : play link
// some file or any data source
var r io.Reader = bytes.NewReader([]byte{1,2,3})
// initialize slice to max expected capacity
dat := make([]byte, 20)
// read some data into it. Trim to length.
n, err := r.Read(dat)
handle(err)
dat = dat[:n]
// now I want to reuse it:
for len(dat) < cap(dat) {
dat = append(dat, 0)
}
log.Println(len(dat))
// add it to free list for reuse later
// bufferPool.Put(dat)
난 항상 고정 할당 길이 조각, 필요한 최대 크기보다 큰 보장됩니다. 버퍼를 사용하려면 실제 데이터 길이로 크기를 줄여야하지만 다음 번에 필요할 때 다시 읽으려면 최대 크기 여야합니다.
내가 슬라이스를 확장하는 방법을 알고있는 유일한 방법은 append
입니다. 그래서 사용하고있는 것입니다. 루프는 비록 더러운 슈퍼를 느낀다. 잠재적으로 비효율적입니다. 내 벤치마킹은 끔찍하지 않다는 것을 보여 주지만 더 나은 방법이 있어야한다고 생각합니다.
슬라이스의 내부 표현에 대해서만 알고 있지만, 실제로 데이터를 추가하지 않고도 길이 값을 어떻게 든 재정의 할 수 있다면 정말 좋을 것입니다. 나는 그것을 제로로 할 필요가 없습니다.
더 좋은 방법이 있나요?
와우, 나는 지금 어리 석다. 나는 그것을 시험해보고 한계를 벗어나 맹세했다. 그러나 당신이 그 역량을 유지하는 한 그것은 정말로 효과가 있습니다. – captncraig