Heim > Backend-Entwicklung > Golang > Warum hat das Hinzufügen von Parallelität meinen Go-Code verlangsamt?

Warum hat das Hinzufügen von Parallelität meinen Go-Code verlangsamt?

DDD
Freigeben: 2024-12-11 11:10:13
Original
405 Leute haben es durchsucht

Why Did Adding Concurrency Slow Down My Go Code?

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage