이 질문은 기존 Go 프로그램에 동시성을 도입할 때 예상하지 못한 성능 저하를 탐구합니다. 이 코드는 게임 내 괴물과의 상호 작용을 시뮬레이션하여 성공적인 아이템 드롭을 추적합니다. 효율성을 높이기 위해 프로그래머는 동시성을 사용하여 사용 가능한 프로세서 간에 작업 부하를 분할하려고 시도했지만 결과적으로 속도가 크게 저하되었습니다.
동시성이 없으면 프로그램은 일련의 시뮬레이션을 실행합니다. (이 경우 1000) 각 시뮬레이션은 지정된 수의 상호 작용(이 예에서는 1,000,000)을 실행합니다. 그런 다음 결과는 성공적인 상호 작용의 총 수를 계산하는 데 사용됩니다.
코드를 병렬화하기 위해 프로그래머는 각각 시뮬레이션의 일부를 실행하는 여러 개의 고루틴을 생성합니다. 고루틴 수와 프로세서 수를 일치시켜 사용 가능한 CPU 간에 작업 부하를 올바르게 분배합니다.
놀랍게도 성능 향상은커녕 동시 코드가 4~6회 실행되었습니다. 순차 대응보다 느립니다.
문제는 공유 상태에 있습니다. 동시 고루틴에 의해 액세스됩니다. 특히 rand.Float64() 함수는 연관된 뮤텍스 잠금이 있는 공유 전역 Rand 인스턴스를 사용합니다. 여러 고루틴이 전역 Rand 인스턴스에 액세스하려고 시도하면 뮤텍스 잠금을 획득해야 하므로 경합이 발생하고 코드 속도가 느려집니다.
성능 문제를 해결하기 위해 프로그래머는 각 고루틴마다 별도의 Rand 인스턴스가 있습니다. 이렇게 하면 전역 Rand 인스턴스에 대한 경합이 제거되어 고루틴이 독립적으로 실행될 수 있습니다.
각 고루틴에 대해 별도의 Rand 인스턴스를 생성하면 성능이 크게 향상됩니다. 이제 동시 코드는 듀얼 코어 CPU에서 비동시 버전보다 약 2.5배 빠르게 실행됩니다.
이 시나리오는 공유 리소스에서 사용되는 동기화 메커니즘을 이해하는 것이 얼마나 중요한지 보여줍니다. 동시성을 구현할 때. 이는 데이터 액세스 패턴이 성능에 미치는 영향과 프로세서 사용률과 동기화 오버헤드 간의 균형을 고려해야 함을 강조합니다.
위 내용은 동시 Go 코드가 순차적 Go 코드보다 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!