Go Analog for Memset
질문:
Go 프로그래머는 다음과 유사한 효율적인 방법을 찾습니다. 기본 루프가 가능하므로 0이 아닌 값으로 배열을 초기화하는 C의 memset 느립니다.
답변:
Go에는 명시적인 memset 기능이 없지만 Go의 기능을 에뮬레이션하는 최적화된 접근 방식이 있습니다.
Loop- 기반 솔루션:
가장 간단한 대안은 다음을 반복하는 루프입니다. 배열, 각 요소에 원하는 값 할당:
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
복사 기반 솔루션:
Go의 최적화된 copy() 함수를 활용하여 배열을 빠르게 초기화할 수 있습니다. . 첫 번째 요소를 수동으로 설정하고 채워진 부분을 반복적으로 복사하면 반복 횟수가 log(n)으로 줄어듭니다.
func memsetRepeat(a []int, v int) { if len(a) == 0 { return } a[0] = v for bp := 1; bp < len(a); bp *= 2 { copy(a[bp:], a[:bp]) } }
성능 비교:
작은 배열의 경우 루프 기반 솔루션이 약간 더 빠릅니다. 그러나 배열 크기가 커질수록 반복 횟수가 줄어들기 때문에 복사 기반 솔루션은 훨씬 더 빨라집니다.
벤치마크 결과:
Array Size | Loop-Based | Copy-Based |
---|---|---|
100 elements | 1.15x slower | |
1,000 elements | 2.5x slower | |
10,000 elements | 2x slower | |
100,000 elements | 1.5x slower |
위 내용은 Go의 Memset과 동일: 0이 아닌 값으로 배열을 효율적으로 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!