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 дает мне разные результаты. При большем размере буфера два гортани никогда не блокируются, поэтому, похоже, требуется меньше времени.
Заранее спасибо.