> 백엔드 개발 > Golang > Go의 Memset과 동일: 0이 아닌 값으로 배열을 효율적으로 초기화하는 방법은 무엇입니까?

Go의 Memset과 동일: 0이 아닌 값으로 배열을 효율적으로 초기화하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-04 02:29:40
원래의
847명이 탐색했습니다.

Go's Memset Equivalent: How to Efficiently Initialize Arrays with Non-Zero Values?

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

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