Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 更快地替代未同步的math/rand_Go - Fatal编程技术网

Go 更快地替代未同步的math/rand

Go 更快地替代未同步的math/rand,go,Go,我正在尝试优化我的遗传算法。这使用了大量的随机数选择(随机突变等) 我决定使用CPU探查器: 导入( “运行时/pprof” ) var cpuprofile=flag.String(“cpuprofile”,“将cpu配置文件写入文件”) func main(){ 如果*cpuprofile!“”{ fmt.Println(*cpf文件) f、 错误:=os.Create(*cpuprofile) 如果错误!=零{ log.Fatal(错误) } _=pprof.StartCPUProfile

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

我决定使用CPU探查器:

导入(
“运行时/pprof”
)
var cpuprofile=flag.String(“cpuprofile”,“将cpu配置文件写入文件”)
func main(){
如果*cpuprofile!“”{
fmt.Println(*cpf文件)
f、 错误:=os.Create(*cpuprofile)
如果错误!=零{
log.Fatal(错误)
}
_=pprof.StartCPUProfile(f)
延迟pprof.stopcpurpofile()
}
***应用程序逻辑***
我惊讶地发现,影响CPU使用率的最大因素之一是
sync.(*Mutex).Unlock
,这主要是因为我在应用程序的任何时候都没有使用线程或goroutine

一些挖掘揭示了瓶颈是由math/rand中的默认源被同步引起的

对于我来说,有没有一种更快的方法可以使用未同步/阻塞的函数生成随机数

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

正如您所发现的,默认的“随机性源”因为
math/rand
包是一个锁定的源代码,适合在并发goroutine中使用。您需要使用为每个goroutine创建一个新源代码,然后使用从中创建一个随机数生成器。此新生成器中的伪随机数的工作方式与(单个)相同锁定源,但如果从同一种子启动,每个生成器将生成其自己的相同生成数流


因此,您需要确保提供给
NewSource
的每个种子都是唯一的,因此每个流都是不同的。

您尝试过吗?我没有尝试过,我会尝试一下。谢谢!在几个地方创建一个新的兰德源代码将我的执行时间从1.29分钟减少到55秒,并消除了互斥和锁定源函数完全支持pprof跟踪。谢谢!感谢您提供此详细信息。出于好奇,使用NewSource后跟New会有很大的开销吗?这是我应该避免经常做的事情吗?这两个函数都会创建指向新值的指针,这意味着它们很可能会导致堆分配。您可以查看函数源代码通过单击文档页面上的函数名。@HymnsForDisco说了什么;我建议如果您要运行N个goroutines以利用N个并行生成,您可以从N个种子源创建N个随机数生成器。之后,您不需要进一步创建,因为只有N个并行例程在运行。您可以可以从任何地方获取种子,但对于实际的随机性,请使用
/dev/uradom
或加密随机或其他方法。感谢实用建议。很有意义。