我正在嘗試優化我的遺傳算法。這使用了很多隨機數選擇(隨機突變等)。我決定使用 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

守著星空守著你
TA貢獻1799條經驗 獲得超8個贊
如果你在 Go 中尋找快速的高質量偽隨機數,我已經創建了一個包(我認為,但我顯然是有偏見的)在不犧牲質量的情況下盡可能快地運行(并且與以下相比顯著改進它):pgregory.net/rand(基準測試)。math/rand
除了避免任何同步之外,它還使用更快的算法并避免使用接口以使內聯成為可能。Source
- 2 回答
- 0 關注
- 99 瀏覽
添加回答
舉報
0/150
提交
取消