Skip to content

Instantly share code, notes, and snippets.

@kougazhang
Created December 31, 2021 01:02
Show Gist options
  • Save kougazhang/b45a49f2ac8aad63173d5e9223919b15 to your computer and use it in GitHub Desktop.
Save kougazhang/b45a49f2ac8aad63173d5e9223919b15 to your computer and use it in GitHub Desktop.
#geektime #golang
package main
import (
"sync"
"sync/atomic"
"testing"
)
type Config struct {
a []int
}
func (c *Config) T() {}
func BenchmarkAtomic(b *testing.B) {
var v atomic.Value
v.Store(&Config{})
go func() {
i := 0
for {
i++
cfg := &Config{a: []int{i, i + 1, i + 2, i + 3, i + 4, i + 5}}
v.Store(cfg)
}
}()
var wg sync.WaitGroup
for n := 0; n < 4; n++ {
wg.Add(1)
go func() {
for n := 0; n < b.N; n++ {
cfg := v.Load().(*Config)
cfg.T()
// fmt.Printf("%v\n", cfg)
}
wg.Done()
}()
}
wg.Wait()
}
func BenchmarkMutex(b *testing.B) {
var l sync.RWMutex
var cfg *Config
go func() {
i := 0
for {
i++
l.Lock()
cfg = &Config{a: []int{i, i + 1, i + 2, i + 3, i + 4, i + 5}}
l.Unlock()
}
}()
var wg sync.WaitGroup
for n := 0; n < 4; n++ {
wg.Add(1)
go func() {
for n := 0; n < b.N; n++ {
l.RLock()
cfg.T()
l.RUnlock()
// fmt.Printf("%v\n", cfg)
}
wg.Done()
}()
}
wg.Wait()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment