我目前正在研究我的学士论文,基本上我的任务是优化Go中的给定代码,即尽可能快地运行.首先,我优化了串行功能,然后尝试通过goroutines引入并行性.在互联网上进行研究之后,由于来自talks.golang的以下幻灯片,我现在理解了并发性和并行性之间的区别.我参观了一些并行编程课程,我们在pthread/openmp的帮助下并行化了ac/c ++代码,因此我尝试在Go中应用这些范例.也就是说,在这个特殊情况下,我正在优化一个函数,它计算一个长度的切片的移动平均值len:=n+(window_size-1)(它等于9393或10175),因此我们有n窗口,我们计算相应的算术平均值,并在输出中正确保存切片.
请注意,此任务本质上是令人尴尬的并行.
在moving_avg_concurrent2我将切片分成num_goroutines小片并用一个goroutine运行.这个功能是用一个goroutine执行的,出于某种原因(但是我们在这里找不到原因,但是我们在这里得到了切线),moving_avg_serial4但是比一个以上的goroutine它开始表现更差moving_avg_serial4.
在moving_avg_concurrent3我所采用的主/工人模式.性能比moving_avg_serial4使用一个goroutine时差.在这里,我们至少在增加时获得了更好的表现,num_goroutines但仍然没有更好moving_avg_serial4.为了比较的性能moving_avg_serial4,moving_avg_concurrent2和moving_avg_concurrent3我写了一个标杆和我列出的结果:
fct & num_goroutines | timing in ns/op | percentage
---------------------------------------------------------------------
serial4 | 4357893 | 100.00%
concur2_1 | 5174818 | 118.75%
concur2_4 | 9986386 | 229.16%
concur2_8 | 18973443 | 435.38%
concur2_32 | 75602438 | 1734.84%
concur3_1 | 32423150 | 744.01%
concur3_4 | 21083897 | …Run Code Online (Sandbox Code Playgroud)