http://play.golang.org/p/Xn3Qw7xAi3
很难理解频道。
我有
func main() {
in := make(chan int)
out := make(chan int)
go QuickSort(in, out)
for i := 0; i < 100; i++ {
in <- rand.Intn(1000)
}
close(in)
for i := range out {
fmt.Println(i)
}
}
这使得两个通道命名为in,out和goroutine函数Quicksort。
1。 QuickSort如何作为参数进出?它是从下面这一行收到的吗?
in <- rand.Intn(1000)
2。 这种情况下使用频道是否最佳?它看起来非常整洁地动态接收值......如果没有通道排序会有什么不同?这种情况更快?
答案 0 :(得分:2)
I wrote the original version of that!
我原来的文章回答了你认为的第二个问题......
只是为了好玩 - 基于频道的快速排序。
有趣的是,您可以快速排序而无法编制索引 你的意见。它可能是O(n log n)用于比较,但它是O(n) 渠道和常规,所以也许不是最有效的快速排序 永远; - )
如果您将它排序,它也会出现最坏的情况O(n²) 输入,所以不要这样做!
它真的很有趣 - 但它使用了大量的通道和goroutine,这会使它变得更慢并且比传统的快速排序使用更多的内存。
答案 1 :(得分:1)
1。 QuickSort如何作为参数进出?它收到了吗? 下面的一行?
此代码将100随机推入名为“in”的频道。您之前已将对此通道的引用传递给quicksort函数。这就像我将函数传递给线程安全堆栈,然后从调用者上下文中将一个新元素推送到该堆栈上一样。
for i := 0; i < 100; i++ {
in <- rand.Intn(1000)
}
close(in)
2。这种情况在使用频道时是否最佳?看起来很漂亮 动态的价值......没有的只是排序会有什么不同 渠道?这种情况更快?
我认为这是一个很酷的玩具示例,说明如何灵活地使用频道(以及流媒体排序)。在大多数常见情况下,通常会更快/更容易地切片并在其上调用sort.Sort。在大多数现实情况下,您还可以通过创建channel with a buffer来获得更好的吞吐量,因为这会减少调度程序在goroutine之间的切换。频道非常快,但它们仍然有开销,如果你实际上没有并行处理,那么开销就不会给你带来任何好处。
如果您想并行处理,请不要忘记设置GOMAXPROCS&gt; 1并使用缓冲通道。
答案 2 :(得分:-1)
问题1的答案是肯定的。示例中的QuickSort需要两个通道作为参数,一个用于读取整数,一个用于在对它们进行排序后写入整数。它与使用stix和stdout在unix命令行上使用sort非常相似。
关于问题2的答案,这只是使用Go Channels和例程来解决标准问题的一个例子。如果你在等待排序返回时还有其他工作要做,那只会更快。
此代码中可能的实际加速是在QuickSort函数中使用通道和goroutine。如果底层硬件有足够的内核 允许您多线程化程序,这可能比单线程版本快得多。
通道和线程的目的是让您轻松利用底层硬件,而不必编写线程代码。比较一下这个版本的基于pthread的快速排序,并将其与go代码进行比较。
http://sc12.supercomputing.org/hpceducator/PythonForParallelism/codes/parallelQuicksort.c