Heim > Backend-Entwicklung > Golang > Warum verlangsamt Parallelität meinen Go-Code mit „rand.Float64()'?

Warum verlangsamt Parallelität meinen Go-Code mit „rand.Float64()'?

Linda Hamilton
Freigeben: 2024-12-12 12:03:15
Original
1003 Leute haben es durchsucht

Why Does Concurrency Slow Down My Go Code Using `rand.Float64()`?

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
}
Nach dem Login kopieren

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage