為什麼加入並發會減慢此 Go 程式碼的速度?
提供的程式碼模擬了遊戲中與怪物的互動以及物品掉落的可能性失敗後。儘管期望程式碼應該完全適合併行化,但添加並發性顯著減慢了速度。
說明:
問題在於 rand.Float64( ),它依賴具有互斥鎖的共享全域物件。當多個 goroutine 嘗試同時使用此函數時,它們會遇到鎖爭用,從而影響效能。
解決方案:
要解決此問題,請建立一個單獨的實例每個 goroutine 的 Rand 結構並使用該實例產生隨機數。這消除了全域鎖的爭用並允許真正的並行化。
更新的程式碼:
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 }
改進的效能:
應用修復程式為每個goroutine 建立新的Rand 實例後,產生的程式碼顯示出顯著的改進表現。使用兩個處理器時,運行模擬所需的時間減少了約 75%。
結論:
在 Go 中使用並發時,避免依賴共享全域蘭德實例。相反,為每個 goroutine 建立單獨的 Rand 結構實例,以確保最佳效能。
以上是為什麼使用「rand.Float64()」並發會減慢我的 Go 程式碼速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!