C에서 memset 함수는 지정된 값으로 배열을 효율적으로 초기화합니다. 그러나 Go에는 직접적인 memset 지원이 부족합니다. 이 기사에서는 유사한 기능을 달성하기 위한 여러 가지 대체 접근 방식을 살펴봅니다.
루프를 사용한 간단한 구현은 다음과 같습니다.
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
최적화된 접근 방식은 효율적인 copy() 기능을 활용합니다.
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]) } }
이 솔루션 bytes.Repeat()의 구현과 유사합니다. 동일한 값으로 채워진 새로운 []바이트를 생성하려면 bytes.Repeat()를 권장합니다.
성능 벤치마크는 memsetLoop()보다 memsetRepeat()가 더 우수함을 보여줍니다. 배열 크기 증가:
Array Size | memsetLoop | memsetRepeat | Improvement |
---|---|---|---|
100 | ~1.15x slower | ~1.15x faster | |
1,000 | ~2.5x slower | ~2.5x faster | |
10,000 | ~2x slower | ~2x faster | |
100,000 | ~1.5x slower | ~1.5x faster |
약 3800-4000 memsetRepeat()는 ~3.2배의 성능 향상을 제공합니다.
memset은 Go에서 기본적으로 지원되지 않지만 memsetLoop() 및 memsetRepeat()는 다음을 사용하여 배열을 초기화하기 위한 효율적인 대안을 제공합니다. 0이 아닌 값. copy()를 활용하는 memsetRepeat()는 대규모 배열을 위한 최적의 솔루션으로 떠오릅니다.
위 내용은 Go에서 배열을 효율적으로 초기화하는 방법: memset 대안?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!