> 백엔드 개발 > Golang > 동시성으로 인해 `rand.Float64()`를 사용하는 Go 코드가 느려지는 이유는 무엇입니까?

동시성으로 인해 `rand.Float64()`를 사용하는 Go 코드가 느려지는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-12 12:03:15
원래의
1003명이 탐색했습니다.

Why Does Concurrency Slow Down My Go Code Using `rand.Float64()`?

동시성을 추가하면 왜 Go 코드가 느려지나요?

제공된 코드는 게임 내 몬스터와의 상호 작용 및 아이템 드롭 가능성을 시뮬레이션합니다. 패배시. 코드가 병렬화에 완벽하게 적합해야 한다는 기대에도 불구하고 동시성을 추가하면 속도가 크게 느려졌습니다.

설명:

문제는 rand.Float64( ), 이는 뮤텍스 잠금이 있는 공유 전역 객체에 의존합니다. 여러 고루틴이 동시에 이 기능을 사용하려고 시도하면 잠금에 대한 경합이 발생하여 성능이 저하됩니다.

해결책:

문제를 해결하려면 별도의 인스턴스를 생성하세요. 각 고루틴에 대한 Rand 구조체를 만들고 해당 인스턴스를 사용하여 난수를 생성합니다. 이는 전역 잠금에 대한 경합을 제거하고 진정한 병렬화를 허용합니다.

업데이트된 코드:

func interaction(generator *rand.Rand) int {
    if generator.Float64() <= DROP_RATE {
        return 1
    }
    return 0
}

func simulation(n int, generator *rand.Rand) []int {
    interactions := make([]int, n)
    for i := range interactions {
        interactions[i] = interaction(generator)
    }
    return interactions
}
로그인 후 복사

향상된 성능:

수정 사항을 적용하여 각 고루틴에 대해 새로운 Rand 인스턴스를 생성한 후 결과 코드는 상당한 개선을 보여줍니다. 성능에. 두 개의 프로세서를 사용하면 시뮬레이션을 실행하는 데 걸리는 시간이 약 75% 단축됩니다.

결론:

Go에서 동시성을 사용할 때는 공유 전역 변수에 의존하지 마세요. 랜드 인스턴스. 대신, 최적의 성능을 보장하려면 각 고루틴에 대해 별도의 Rand 구조체 인스턴스를 생성하세요.

위 내용은 동시성으로 인해 `rand.Float64()`를 사용하는 Go 코드가 느려지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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