Go에서 슬라이스 작업을 추가하는 것보다 직접 할당이 더 빠릅니까?

DDD
풀어 주다: 2024-11-10 06:41:02
원래의
671명이 탐색했습니다.

Is Direct Assignment Faster than Append for Slice Operations in Go?

Go에서 슬라이스 추가 작업 가속화

Go에서 슬라이스는 일련의 값을 저장하는 중요한 데이터 구조입니다. 슬라이스에 요소를 추가할 때 성능을 최적화하는 것이 중요합니다. 이 문서에서는 슬라이스에 추가하는 두 가지 방법인 추가와 직접 할당(=) 간의 성능 차이를 살펴봅니다.

벤치마크 분석

성능을 비교하기 위해 다음을 실행했습니다. 다음 코드를 사용하는 두 가지 벤치마크:

func BenchmarkSliceAppend(b *testing.B) {
    a := make([]int, 0, b.N)  // Create an empty slice with sufficient capacity
    for i := 0; i < b.N; i++ {
        a = append(a, i)  // Append i to the slice
    }
}

func BenchmarkSliceSet(b *testing.B) {
    a := make([]int, b.N)  // Create a slice with size b.N
    for i := 0; i < b.N; i++ {
        a[i] = i  // Assign i to the slice's ith element
    }
}
로그인 후 복사

벤치마크 결과에 따르면 직접 할당(a[i] = i)이 추가를 사용하는 것보다 훨씬 빠릅니다.

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

할당이 추가보다 빠른 이유는 무엇입니까?

성능 차이는 각 메서드에서 수행되는 고유한 작업에서 비롯됩니다.

  • 직접 할당(a[i] = i ): 이는 단순히 슬라이스의 i번째 요소 값을 i로 설정합니다.
  • Append (a = 추가(a, i)): 이 함수에는 다음이 포함됩니다. 더 복잡한 프로세스:

    1. 내장된 추가 기능을 호출하여 새로운 슬라이스 헤더와 가변 매개변수에 대한 임시 슬라이스를 생성합니다.
    2. 충분한 경우 기존 슬라이스를 다시 분할합니다. 용량.
    3. 새 슬라이스의 마지막 요소에 i를 할당합니다.
    4. 새 슬라이스를 참조하도록 지역 변수 a를 업데이트합니다.

요약하면 각 추가 작업에는 슬라이스 헤더를 복사하고 임시 슬라이스를 생성하는 데 추가 오버헤드가 포함되는 반면, 직접 할당은 단순히 기존 슬라이스 요소를 수정합니다. 이러한 오버헤드는 관찰된 성능 차이의 원인이 됩니다.

권장 사항

슬라이스에 추가할 때 최적의 성능을 얻으려면 make를 반복적으로 사용하기보다는 make를 사용하여 충분한 용량을 미리 할당하는 것이 좋습니다. 추가 기능. 이렇게 하면 동적 메모리 할당 및 재슬라이싱이 필요하지 않아 효율성이 크게 향상됩니다.

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

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