> 백엔드 개발 > Golang > Go에서 배열을 효율적으로 초기화하는 방법: memset 대안?

Go에서 배열을 효율적으로 초기화하는 방법: memset 대안?

Barbara Streisand
풀어 주다: 2024-12-31 05:00:12
원래의
959명이 탐색했습니다.

How to Efficiently Initialize Arrays in Go: memset Alternatives?

Go의 memset 아날로그

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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