小编bat*_*ast的帖子

为什么这些goroutine不能通过更多的并发执行来扩展它们的性能?

背景

我目前正在研究我的学士论文,基本上我的任务是优化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_concurrent2moving_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)

parallel-processing concurrency optimization performance go

5
推荐指数
1
解决办法
952
查看次数