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

我正在尝试优化我的遗传算法。这使用了很多随机数选择(随机突变等)。


我决定使用 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

http://img3.mukewang.com/63058e3d0001ef4b06800675.jpg

一些挖掘显示,瓶颈是由数学/兰特中的默认源同步引起的。

有没有一种更快的方法来生成具有不同步/阻塞的函数的随机数?

真正的随机性/准确的伪随机性对于这个应用程序来说并不那么重要,但是如果我没有连续多次获得完全相同的数字,那将是首选。


千万里不及你
浏览 117回答 2
2回答

德玛西亚99

如您所见,包的默认“随机性源”是锁定的源,适合在并发 goroutine 中使用。您需要使用NewSource函数为每个goroutine创建一个新源,然后使用New从中创建一个随机数生成器。来自这个新生成器的伪随机数的工作方式与(单个)锁定源相同,只是每个生成器将生成自己的相同生成数字流(如果从同一种子开始)。math/rand因此,您需要确保提供的每个种子都是唯一的,以便每个流都是不同的。NewSource

守着星空守着你

如果你在 Go 中寻找快速的高质量伪随机数,我已经创建了一个包(我认为,但我显然是有偏见的)在不牺牲质量的情况下尽可能快地运行(并且与以下相比显著改进它):pgregory.net/rand(基准测试)。math/rand除了避免任何同步之外,它还使用更快的算法并避免使用接口以使内联成为可能。Source
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go