Warum verlangsamt das Hinzufügen von Parallelität diesen Go-Code?
Der bereitgestellte Code simuliert Interaktionen mit Monstern in einem Spiel und die Wahrscheinlichkeit, dass Gegenstände fallen gelassen werden bei einer Niederlage. Trotz der Erwartungen, dass der Code perfekt für die Parallelisierung geeignet sein sollte, wurde er durch das Hinzufügen von Parallelität erheblich verlangsamt.
Erklärung:
Das Problem liegt in der Verwendung von rand.Float64( ), das auf einem gemeinsam genutzten globalen Objekt mit einer Mutex-Sperre basiert. Wenn mehrere Goroutinen versuchen, diese Funktion gleichzeitig zu verwenden, stoßen sie auf einen Konflikt um die Sperre, was die Leistung beeinträchtigt.
Lösung:
Um das Problem zu beheben, erstellen Sie eine separate Instanz von die Rand-Struktur für jede Goroutine und verwenden Sie diese Instanz, um Zufallszahlen zu generieren. Dies beseitigt den Konflikt um die globale Sperre und ermöglicht eine echte Parallelisierung.
Aktualisierter Code:
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 }
Verbesserte Leistung:
Nachdem die Korrekturen angewendet wurden, um für jede Goroutine neue Rand-Instanzen zu erstellen, zeigt der resultierende Code eine deutliche Leistungsverbesserung. Die Zeit, die zum Ausführen der Simulationen benötigt wird, wird bei Verwendung von zwei Prozessoren um etwa 75 % reduziert.
Fazit:
Wenn Sie Parallelität in Go verwenden, verlassen Sie sich nicht auf das Shared Global Rand-Instanz. Erstellen Sie stattdessen separate Instanzen der Rand-Struktur für jede Goroutine, um eine optimale Leistung sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum verlangsamt Parallelität meinen Go-Code mit „rand.Float64()'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!