2013-12-01 2 views
1

Go: буферная сумма канала быстрее?Go: буферная сумма канала быстрее?

На следующей ссылке площадка,

http://play.golang.org/p/8OAbtn6koN

Один способ содержит буферный канал, и я ожидал, что это работать лучше, потому что он не ждет синхронизации.

ch := make(chan int, 2) 

Три метода, которые суммируют массив случайных чисел. Я бенчмарк эти три функций, как по следующей ссылка:

http://play.golang.org/p/JK3yL4QwOJ

Моего expection был буферизация канал является асинхронным и отправкой или получения не нужно ждать, пока канал не будет заполнен, поэтому buffured сумма канала работает лучше, чем небуферизованная сумма канала потому что не требуется времени для синхронизации всех goroutines.

[Вопрос 1] Так что я дал 3 размера буфера для забуференной функции суммы канала, но тест результата подобен следующему:

Benchmarklinear  10 122170091 ns/op 
BenchmarkchSum  20 121921287 ns/op 
testing: BenchmarkchSum left GOMAXPROCS set to 4 
BenchmarkchSumBuffer  20 118524619 ns/op 
testing: BenchmarkchSumBuffer left GOMAXPROCS set to 4 
ok ~/Benchmark_sum_01 4.056s 

Это не имеет смысла, поэтому в этом случае суммы два канала выполнять то же самое? Должен ли режим с буфером работать лучше?

[Вопрос 2]

Если я дам

ch := make(chan int, 1) 

Я получаю

Benchmarklinear  10 122170091 ns/op 
BenchmarkchSum  20 121921287 ns/op 
testing: BenchmarkchSum left GOMAXPROCS set to 4 
BenchmarkchSumBuffer  10 118524619 ns/op 
testing: BenchmarkchSumBuffer left GOMAXPROCS set to 4 

Если я дам

ch := make(chan int, 2) 

Я получаю

Benchmarklinear  10 122170091 ns/op 
BenchmarkchSum  10 121921287 ns/op 
testing: BenchmarkchSum left GOMAXPROCS set to 4 
BenchmarkchSumBuffer  20 118524619 ns/op 
testing: BenchmarkchSumBuffer left GOMAXPROCS set to 4 

Но результат очень несовместим. Каждый раз, когда я запускаю тестовый тест, у меня получается другой результат.

Размер буфера не относится к характеристикам? Почему эталон с буферизацией 2 дает мне разные результаты. При большем размере буфера два гортани никогда не блокируются, поэтому, похоже, требуется меньше времени.

Заранее спасибо.

ответ

0

Отсутствие буферизации несущественно. Ожидается получение на небуферизованном канале. Поэтому, как только вы отправляете значение на канал, оно принимается, что освобождает канал для следующей отправки.

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