【发布时间】:2014-04-03 22:29:03
【问题描述】:
我在 Go 中编写了两个版本的归并排序。一个有 goroutine,另一个没有。我正在比较每个人的表现,我一直在看
https://github.com/denniss/goplayground/blob/master/src/example/sort.go#L69
那是使用 goroutines 的那个。这是一个没有
https://github.com/denniss/goplayground/blob/master/src/example/sort.go#L8
我一直试图弄清楚为什么 goroutine 实现的性能比没有的要差得多。这是我在本地看到的号码
go run src/main.go
[5 4 3 2 1]
Normal Mergesort
[1 2 3 4 5]
Time: 724
Mergesort with Goroutines
[1 2 3 4 5]
Time: 26690
但我仍然无法弄清楚原因。想知道你们是否可以给我关于做什么/看什么的建议或想法。在我看来,使用 goroutines 的实现至少应该表现得更好一些。我这么说主要是因为以下几行
go MergeSortAsync(numbers[0:m], lchan)
go MergeSortAsync(numbers[m:l], rchan)
【问题讨论】:
-
由于您的工作受 CPU 限制,您很可能看不到性能提升,因为 Go 默认只使用 1 个线程。查看 GOMAXPROCS 环境变量,尝试将其设置为 2,然后看看会发生什么。
-
对 5 个项目进行排序不是一个现实的测试。
-
感谢大家的回复。尝试将 GOMAXPROCS 设置为 2
runtime.GOMAXPROCS(2),但仍然不行。是的,我尝试对 100 进行排序,结果几乎相同。使用 goroutine 的表现更差。 -
您需要 waaaaaaaay 更多的数据才能像@FredtheMagicWonderDog 提到的那样进行适当的测试。当你有足够的数据时,实际工作会变得更加昂贵,因此你现在拥有的东西是有保证的……这只是没有实际数据量的开销。
-
请:使用包测试的正常基准测试功能,而不是您自己的计时。
标签: sorting go mergesort goroutine