为了账号安全,请及时绑定邮箱和手机立即绑定

更快替代不同步的数学/兰特

更快替代不同步的数学/兰特

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 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信