我正在尝试优化我的遗传算法。这使用了很多随机数选择(随机突变等)。我决定使用 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 关注
- 72 浏览
添加回答
举报
0/150
提交
取消