Go에서 `append()`와 슬라이스 할당 중 어느 것이 더 빠릅니까?

DDD
풀어 주다: 2024-11-11 01:49:02
원래의
724명이 탐색했습니다.

Which is faster in Go: `append()` or slice assignment?

Go에서 슬라이스 추가 및 할당 성능 비교

Go에서 슬라이싱은 데이터를 효율적으로 관리하는 데 중요한 역할을 합니다. 그러나 일반적으로 사용되는 두 가지 슬라이스 작업인 추가와 할당 사이의 성능 차이에 대한 의문이 제기됩니다.

추가 및 할당

append() 작업은 기존 슬라이스를 확장합니다. 추가 요소를 사용하는 반면 할당 연산자(=)를 슬라이스에 적용하면 단순히 기존 요소를 새 값으로 덮어씁니다.

성능 분석

다음 코드 벤치마킹 성능 격차를 보여줍니다.

func BenchmarkSliceAppend(b *testing.B) {
    a := make([]int, 0, b.N)
    for i := 0; i < b.N; i++ {
        a = append(a, i)
    }
}

func BenchmarkSliceSet(b *testing.B) {
    a := make([]int, b.N)
    for i := 0; i < b.N; i++ {
        a[i] = i
    }
}
로그인 후 복사

벤치마크 결과는 "a[i] = i"(할당)가 "a = 추가(a, i)"(추가)보다 지속적으로 성능이 뛰어난 것으로 나타났습니다.

BenchmarkSliceAppend    200000000                7.87 ns/op            8 B/op          0 allocs/op
BenchmarkSliceSet       300000000                5.76 ns/op            8 B/op
로그인 후 복사

설명

"a[i] = i"의 성능이 더 빠른 것은 직접 할당 특성 때문일 수 있습니다. 이는 단순히 i 값을 슬라이스의 해당 요소에 할당합니다.

반면 "a = 추가(a, i)"에는 일련의 작업이 포함됩니다.

  1. 복사 기존 슬라이스 헤더.
  2. 가변 매개변수(i)에 대한 임시 슬라이스를 생성합니다.
  3. 용량이 충분하면 a를 다시 슬라이스합니다(벤치마크에서 제공됨).
  4. i를 a의 마지막 요소.
  5. 로컬 변수(a)의 슬라이스 헤더를 업데이트합니다.

이러한 추가 단계는 "a[i] = i의 직접 할당에 비해 오버헤드를 발생시킵니다. ".

결론

슬라이스 작업 간의 성능 차이를 이해하는 것은 코드 효율성을 최적화하는 데 중요합니다. 간단한 값 할당의 경우 "a[i] = i"가 더 효율적인 선택임이 입증되었습니다. 그러나 슬라이스 확장이 필요한 경우 "a = 추가(a, i)"가 여전히 적절한 접근 방식입니다.

위 내용은 Go에서 `append()`와 슬라이스 할당 중 어느 것이 더 빠릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿