首頁 >後端開發 >Golang >為什麼添加並發會減慢我的 Go 程式碼速度?

為什麼添加並發會減慢我的 Go 程式碼速度?

DDD
DDD原創
2024-12-11 11:10:13412瀏覽

Why Did Adding Concurrency Slow Down My Go Code?

並發會拖慢Golang 代碼

為了優化模擬與怪物交互和物品掉落的代碼,引入了並發,這對性能產生了令人驚訝的影響

原始程式碼沒有並發,主要功能有互動、模擬、測試三大功能。交互模擬單次交互,如果物品掉落則返回 1,否則返回 0。模擬執行多個互動並將結果儲存在切片中。 test 運行了一系列模擬,並將成功互動的總數儲存在一個切片中。

新增並發時,為每個測試建立 goroutine,每個 goroutine 都運行自己的模擬副本。然而,性能不但沒有提高,反而惡化了。

速度緩慢的原因

問題在於 rand.Float64() 函數,該函數使用帶有互斥鎖的共享全域物件鎖定。預設情況下,每個 goroutine 在呼叫 rand.Float64() 時都會取得此互斥鎖,最終降低效能。

要解決此問題,需要使用單獨的 rand。為每個 CPU 建立了 New() 實例。這消除了共享互斥鎖問題並顯著提高了效能。

額外改進

透過使用直接取代 rand.Float64() 便利函數,實現了進一步的效能提升呼叫 Rand 結構。便利函數使用全域互斥保護的 Rand 實例,而直接呼叫則避免了這種開銷。

結論

雖然並發可以提高某些問題的性能,但正確的實現至關重要。在這種情況下,使用單獨的 rand.New() 實例並避免共享互斥鎖是最大限度減少效能下降的關鍵。

以上是為什麼添加並發會減慢我的 Go 程式碼速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn