Go에서 슬라이스 할당이 슬라이스 추가보다 항상 더 빠릅니까?

Linda Hamilton
풀어 주다: 2024-11-12 10:19:02
원래의
896명이 탐색했습니다.

Is Slice Assignment Always Faster Than Slice Append in Go?

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

Go에서 슬라이스로 작업할 때 요소 추가 및 할당과 같은 작업은 상당한 영향을 미칠 수 있습니다. 성능에 미치는 영향. 슬라이스 추가를 위한 두 가지 일반적인 방법을 사용할 수 있습니다:

append(slice, value): 이 함수는 새 요소를 수용할 수 있도록 확장된 용량을 가진 새 슬라이스를 생성하고 기존 요소를 new Slice.

slice[index] = value: 이 할당은 생성하지 않고 슬라이스의 지정된 인덱스에 있는 요소를 직접 수정합니다. 새로운 사본.

이 두 접근 방식의 성능을 비교하기 위해 다음 두 가지 벤치마크 함수가 생성되었습니다.

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
    }
}
로그인 후 복사

결과는 slice[index] = value은 append(slice, 값):

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

성능 차이 이해

슬라이스 할당이 슬라이스 추가보다 빠른 이유는 무엇입니까? 주요 차이점은 할당이 복사나 재할당 없이 기존 슬라이스를 수정하는 간단한 내부 작업이라는 점입니다.

반면 추가 기능에는 여러 단계가 포함됩니다.

    기존 슬라이스 헤더 복사
  1. 가변변수에 대한 임시 슬라이스 생성 매개변수
  2. 필요한 경우 기존 슬라이스 재슬라이싱
  3. 슬라이스의 요소에 새 값 할당
  4. 새 슬라이스 반환, 그런 다음 로컬 변수에 할당
이러한 단계 중 일부가 최적화되거나 인라인화되더라도 각 루프 반복에서 로컬 슬라이스 변수를 업데이트해야 합니다. 단순한 할당 작업에 비해 계산 오버헤드가 추가됩니다.

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

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