亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

更快替代不同步的數學/蘭特

更快替代不同步的數學/蘭特

Go
千萬里不及你 2022-08-24 10:34:09
我正在嘗試優化我的遺傳算法。這使用了很多隨機數選擇(隨機突變等)。我決定使用 CPU 分析器:import (    "runtime/pprof")var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")func main() {    if *cpuprofile != "" {        fmt.Println(*cpuprofile)        f, err := os.Create(*cpuprofile)        if err != nil {            log.Fatal(err)        }        _ = pprof.StartCPUProfile(f)        defer pprof.StopCPUProfile()    }    ***app logic***我很驚訝地發現,CPU使用率的最大貢獻者之一是,特別是因為我在應用程序中的任何時候都沒有使用過線程或goroutines。sync.(*Mutex).Unlock一些挖掘顯示,瓶頸是由數學/蘭特中的默認源同步引起的。有沒有一種更快的方法來生成具有不同步/阻塞的函數的隨機數?真正的隨機性/準確的偽隨機性對于這個應用程序來說并不那么重要,但是如果我沒有連續多次獲得完全相同的數字,那將是首選。
查看完整描述

2 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

如您所見,包的默認“隨機性源”是鎖定的源,適合在并發 goroutine 中使用。您需要使用NewSource函數為每個goroutine創建一個新源,然后使用New從中創建一個隨機數生成器。來自這個新生成器的偽隨機數的工作方式與(單個)鎖定源相同,只是每個生成器將生成自己的相同生成數字流(如果從同一種子開始)。math/rand

因此,您需要確保提供的每個種子都是唯一的,以便每個流都是不同的。NewSource


查看完整回答
反對 回復 2022-08-24
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

如果你在 Go 中尋找快速的高質量偽隨機數,我已經創建了一個包(我認為,但我顯然是有偏見的)在不犧牲質量的情況下盡可能快地運行(并且與以下相比顯著改進它):pgregory.net/rand基準測試)。math/rand

除了避免任何同步之外,它還使用更快的算法并避免使用接口以使內聯成為可能。Source


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號