Skip to content

Instantly share code, notes, and snippets.

@inotnako
Last active January 15, 2017 17:44
Show Gist options
  • Save inotnako/5465c26d427cb91379386b8958f0effa to your computer and use it in GitHub Desktop.
Save inotnako/5465c26d427cb91379386b8958f0effa to your computer and use it in GitHub Desktop.
bench channels like pubsub
package bench_chennels
import (
"runtime"
"sync"
"testing"
)
type Data struct {
Topic string
Payload []byte
}
// просто отправка данных по каналу
func Benchmark_Channels_Parallel(b *testing.B) {
cpu := runtime.GOMAXPROCS(-1)
trafic := make(chan *Data, cpu)
wg := &sync.WaitGroup{}
wg.Add(cpu)
for i := 0; i < cpu; i++ {
go func() {
wg.Done()
for _ = range trafic {
}
}()
}
obj := &Data{
Topic: `aloxa`,
Payload: []byte(`hello!`),
}
wg.Wait()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
trafic <- obj
}
})
close(trafic)
}
type Subscriber chan *Data
// аля pubsub на 10 подписчиков
func Benchmark_Array10Channels_Parallel(b *testing.B) {
cpu := runtime.GOMAXPROCS(-1)
subscribers := []Subscriber{}
wg := &sync.WaitGroup{}
for a := 0; a < 10; a++ {
wg.Add(cpu)
trafic := make(chan *Data, cpu)
for i := 0; i < cpu; i++ {
go func(sub Subscriber) {
wg.Done()
for _ = range sub {
}
}(trafic)
}
subscribers = append(subscribers, trafic)
}
defer func() {
for s := range subscribers {
close(subscribers[s])
}
}()
obj := &Data{
Topic: `aloxa`,
Payload: []byte(`hello!`),
}
publish := func() {
for s := range subscribers {
subscribers[s] <- obj
}
}
wg.Wait()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
publish()
}
})
}
// аля pubsub на 100 подписчиков
func Benchmark_Array100Channels_Parallel(b *testing.B) {
cpu := runtime.GOMAXPROCS(-1)
subscribers := []Subscriber{}
wg := &sync.WaitGroup{}
for a := 0; a < 100; a++ {
wg.Add(cpu)
trafic := make(chan *Data, cpu)
for i := 0; i < cpu; i++ {
go func(sub Subscriber) {
wg.Done()
for _ = range sub {
}
}(trafic)
}
subscribers = append(subscribers, trafic)
}
defer func() {
for s := range subscribers {
close(subscribers[s])
}
}()
obj := &Data{
Topic: `aloxa`,
Payload: []byte(`hello!`),
}
publish := func() {
for s := range subscribers {
subscribers[s] <- obj
}
}
wg.Wait()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
publish()
}
})
}
/*
$ go test -bench=. -run=Benchmark ./bench_chennels/bench_test.go -benchtime=1s -cpu=4,8,16,32,64 -benchmem
Benchmark_Channels_Parallel-4 5000000 333 ns/op 0 B/op 0 allocs/op
Benchmark_Channels_Parallel-8 5000000 311 ns/op 0 B/op 0 allocs/op
Benchmark_Channels_Parallel-16 5000000 264 ns/op 0 B/op 0 allocs/op
Benchmark_Channels_Parallel-32 10000000 226 ns/op 0 B/op 0 allocs/op
Benchmark_Channels_Parallel-64 10000000 203 ns/op 0 B/op 0 allocs/op
Benchmark_Array10Channels_Parallel-4 1000000 1552 ns/op 0 B/op 0 allocs/op
Benchmark_Array10Channels_Parallel-8 1000000 1301 ns/op 0 B/op 0 allocs/op
Benchmark_Array10Channels_Parallel-16 1000000 1189 ns/op 0 B/op 0 allocs/op
Benchmark_Array10Channels_Parallel-32 1000000 1119 ns/op 0 B/op 0 allocs/op
Benchmark_Array10Channels_Parallel-64 1000000 1018 ns/op 0 B/op 0 allocs/op
Benchmark_Array100Channels_Parallel-4 100000 11705 ns/op 0 B/op 0 allocs/op
Benchmark_Array100Channels_Parallel-8 200000 10042 ns/op 0 B/op 0 allocs/op
Benchmark_Array100Channels_Parallel-16 200000 8950 ns/op 0 B/op 0 allocs/op
Benchmark_Array100Channels_Parallel-32 200000 7829 ns/op 0 B/op 0 allocs/op
Benchmark_Array100Channels_Parallel-64 200000 7112 ns/op 0 B/op 0 allocs/op
PASS
ok command-line-arguments 25.134s
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment