Parallelität verlangsamt Golang-Code
Um den Code zu optimieren, der Interaktionen mit Monstern und Item-Drops simuliert, wurde Parallelität eingeführt, was sich überraschenderweise auf die Leistung auswirkte negativ.
Der ursprüngliche Code ohne Parallelität hatte drei Hauptfunktionen: Interaktion, Simulation und Test. Interaktion simulierte eine einzelne Interaktion und gab eine 1 für das Ablegen von Gegenständen zurück, andernfalls eine 0. Die Simulation führte mehrere Interaktionen durch und speicherte die Ergebnisse in einem Slice. test führte eine Reihe von Simulationen durch und speicherte die Gesamtzahl erfolgreicher Interaktionen in einem Slice.
Als Parallelität hinzugefügt wurde, wurden Goroutinen für jeden Test erstellt, wobei jede Goroutine mit ihrer eigenen Kopie der Simulation ausgeführt wurde. Die Leistung verschlechterte sich jedoch statt zu verbessern.
Grund für die Verlangsamung
Das Problem lag in der Funktion rand.Float64(), die ein gemeinsames globales Objekt mit einem Mutex verwendet sperren. Standardmäßig würde jede Goroutine diese Mutex-Sperre erhalten, wenn sie rand.Float64() aufruft, was letztendlich die Leistung verlangsamt.
Lösung
Um dieses Problem zu beheben, ein separater Rand. Für jede CPU wurde eine New()-Instanz erstellt. Dadurch wurde das Problem der gemeinsamen Mutex-Sperre beseitigt und die Leistung erheblich verbessert.
Zusätzliche Verbesserung
Eine weitere Leistungssteigerung wurde durch das Ersetzen der Convenience-Funktion rand.Float64() durch direct erzielt Aufrufe der Rand-Struktur. Die Convenience-Funktion verwendet eine globale Mutex-geschützte Rand-Instanz, während die direkten Aufrufe diesen Overhead vermeiden.
Fazit
Während Parallelität die Leistung bei bestimmten Problemen verbessern kann, ist eine ordnungsgemäße Implementierung erforderlich ist entscheidend. In diesem Fall waren die Verwendung separater rand.New()-Instanzen und die Vermeidung gemeinsamer Mutex-Sperren der Schlüssel zur Minimierung von Leistungseinbußen.
Das obige ist der detaillierte Inhalt vonWarum hat das Hinzufügen von Parallelität meinen Go-Code verlangsamt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!