並發會拖慢Golang 代碼
為了優化模擬與怪物交互和物品掉落的代碼,引入了並發,這對性能產生了令人驚訝的影響
原始程式碼沒有並發,主要功能有互動、模擬、測試三大功能。交互模擬單次交互,如果物品掉落則返回 1,否則返回 0。模擬執行多個互動並將結果儲存在切片中。 test 運行了一系列模擬,並將成功互動的總數儲存在一個切片中。
新增並發時,為每個測試建立 goroutine,每個 goroutine 都運行自己的模擬副本。然而,性能不但沒有提高,反而惡化了。
速度緩慢的原因
問題在於 rand.Float64() 函數,該函數使用帶有互斥鎖的共享全域物件鎖定。預設情況下,每個 goroutine 在呼叫 rand.Float64() 時都會取得此互斥鎖,最終降低效能。
解
要解決此問題,需要使用單獨的 rand。為每個 CPU 建立了 New() 實例。這消除了共享互斥鎖問題並顯著提高了效能。
額外改進
透過使用直接取代 rand.Float64() 便利函數,實現了進一步的效能提升呼叫 Rand 結構。便利函數使用全域互斥保護的 Rand 實例,而直接呼叫則避免了這種開銷。
結論
雖然並發可以提高某些問題的性能,但正確的實現至關重要。在這種情況下,使用單獨的 rand.New() 實例並避免共享互斥鎖是最大限度減少效能下降的關鍵。
以上是為什麼添加並發會減慢我的 Go 程式碼速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!