2013-11-11 2 views
0

http://play.golang.org/p/Xn3Qw7xAi3Go: канал необходим в этом случае?

Трудно понять канал.

Здесь я

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) 
    } 
} 

Это делает два канала, названные в, из и goroutine функции Быстрой сортировки.

1. Как использовать QuickSort как аргументы? Получает ли он от строки ниже?

in <- rand.Intn(1000) 

2. Является ли этот случай оптимальным использованием канала? Он выглядит довольно аккуратно, получая значения динамически ... Что было бы иначе, просто сортировка без канала? Этот случай быстрее?

ответ

2

I wrote the original version of that!

Мой оригинальный рецензия ответ на ваш второй вопрос, я думаю ...

Просто для удовольствия - на основе сортировки каналов.

Интересно, что вы можете сделать быстродействующую сортировку без указания индекса . Это может быть O (N журнал N) для сравнения, но это O (п) для каналов и идут процедуры так, возможно, не самый эффективный QuickSort когда-либо ;-)

Он также имеет худший случай сложности O (n²), если вы его кормите сортированным ввода, так что не делайте этого!

На самом деле это очень весело, но он использует очень много каналов и goroutines, что сделает его медленнее и использует больше памяти, чем традиционная быстродействующая сортировка.

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, так как это уменьшит переход планировщика между goroutines. Каналы очень быстрые, но у них все еще есть накладные расходы, и если вы фактически не обрабатываете параллельно, что накладные расходы не покупают вас.

Если вы хотите параллельно работать, не забудьте установить GOMAXPROCS> 1 и использовать буферные каналы.

-1

Ответ на вопрос 1: да. QuickSort в этом примере ожидает два канала в качестве аргументов: один для чтения ints и один для записи ints после сортировки. Это очень похоже на использование sort в командной строке unix с stdin и stdout.

Что касается ответа на вопрос 2, это всего лишь пример использования Go-каналов и переходов для решения стандартной проблемы. Это было бы только быстрее, если бы у вас была какая-то другая работа, ожидая возвращения сортировки.

Настоящая скорость, возможная в этом коде, - использование каналов и goroutines внутри функции QuickSort. Если ваше базовое оборудование имеет достаточное количество ядер до , вы можете использовать многопоточную программу, это может быть значительно быстрее, чем однопоточная версия.

Точка доступа каналов и потоков позволяет вам легко использовать базовое оборудование без трудностей написания кода с резьбой. Для сравнения взгляните на эту версию quickthort на основе pthread и сравните ее с кодом go.

http://sc12.supercomputing.org/hpceducator/PythonForParallelism/codes/parallelQuicksort.c

Смежные вопросы