在此 Go 程式碼中,test() 函數並行執行多個模擬。然而,添加並發會降低程式速度。
問題在於模擬如何與隨機數產生器互動。預設情況下,Go rand 套件使用 Rand 類型的全域實例,並受互斥鎖保護。當使用便利函數 rand.Float64() 時,每個 goroutine 都必須取得此鎖,從而產生了減慢程式速度的瓶頸。
並行化程式碼實際上,為每個 goroutine 建立一個單獨的 Rand 類型實例。這消除了對互斥鎖的需要,並允許 goroutine 獨立運行。
範例程式碼:
// Create a new Rand instance for each goroutine source := rand.NewSource(time.Now().UnixNano()) generator := rand.New(source)
用法:
將生成器實例傳遞給互動()和模擬()和模擬( )等函數以產生沒有互斥鎖的隨機數鎖爭用。
result := interaction(generator)
透過解決互斥鎖問題,程式碼現在可以充分利用並發性來加速模擬。
以上是為什麼並發會減慢我的圍棋物品掉落模擬速度,如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!