동시성은 Golang 코드를 느리게 합니다
몬스터 및 아이템 드롭과의 상호 작용을 시뮬레이션하는 코드를 최적화하기 위해 동시성이 도입되어 놀랍게도 성능에 영향을 미쳤습니다.
동시성이 없는 원래 코드에는 상호 작용, 시뮬레이션, 그리고 세 가지 주요 기능이 있었습니다. 시험. 상호 작용은 단일 상호 작용을 시뮬레이션하고 항목이 떨어지면 1을 반환하고 그렇지 않으면 0을 반환합니다. 시뮬레이션은 여러 상호 작용을 실행하고 결과를 슬라이스에 저장했습니다. test는 일련의 시뮬레이션을 실행하고 전체 성공적인 상호 작용 수를 슬라이스에 저장했습니다.
동시성이 추가되면 각 테스트마다 고루틴이 생성되고 각 고루틴은 자체 시뮬레이션 복사본으로 실행됩니다. 그러나 성능은 좋아지기는커녕 오히려 악화되었습니다.
느린 이유
문제는 공유 전역 객체를 Mutex와 함께 사용하는 rand.Float64() 함수에 있었습니다. 잠그다. 기본적으로 각 고루틴은 rand.Float64()를 호출할 때 이 Mutex 잠금을 획득하여 결과적으로 성능이 저하됩니다.
해결책
이 문제를 해결하려면 별도의 rand가 필요합니다. 각 CPU마다 New() 인스턴스가 생성되었습니다. 이를 통해 공유 Mutex 잠금 문제가 제거되고 성능이 크게 향상되었습니다.
추가 개선
rand.Float64() 편의 함수를 직접 함수로 대체하여 성능이 더욱 향상되었습니다. Rand 구조체를 호출합니다. 편의 기능은 전역 뮤텍스로 보호되는 Rand 인스턴스를 사용하는 반면 직접 호출은 이러한 오버헤드를 방지합니다.
결론
동시성은 특정 문제에 대한 성능을 향상시킬 수 있지만 적절한 구현 결정적이다. 이 경우 별도의 rand.New() 인스턴스를 사용하고 공유 Mutex 잠금을 피하는 것이 성능 저하를 최소화하는 데 중요했습니다.
위 내용은 동시성을 추가하면 Go 코드가 느려지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!