동시성을 추가하면 왜 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!