éããã°éãã»ã©è¯ããã©ããããããã§ãããã©ã³ã¶ã¯ã·ã§ã³ãå®è£ ä¸ã§ãã
ãã©ã³ã¶ã¯ã·ã§ã³ã®ä¸¦è¡å¦çã§ S2PL (Strict Two Phase Lock) ã Go ã§å®è£ ãããã¨ãã¦ããã®ã§ãããã©ããã¦ãææ ¼å¯è½ãª Reader Writer Mutex ãå¿ è¦ã«ãªããGithub ã«ããå®è£ ããªãã£ãã®ã§èªåã§å®è£ ãããã¨ãã¦ãã¾ãã
ãã¦ãç¬èªã® Mutex ãå®è£
ããã«ããã goroutine å士ã®å¾
ã¡åããã¯ä½ãã使ã£ã¦å®ç¾ããå¿
è¦ãããã¾ãããGo ã«ã¯ sync.Mutex
ã¨ãã£ãã«ãããã¾ãã
ã©ã¡ãã¨ããããã¯ãã¦ã¢ã³ããã¯ããã¨ãããã¨ãã§ãã¾ããæ¯ãèãã¯åãã§ãã
æ¯ãèããåãã¨ãªãã°ã©ã¡ããéãããéè¦ã¨ãªãã¾ãã
ã¨ãããã¨ã§å®é¨ãã¦ã¿ã¾ããã
å®é¨
ç°å¢ã¯ä»¥ä¸ã®éãã§ãã
- OS : macOS 10.14.6
- Hardware : Macbook Pro 13-inch 2018
- CPU : 2.7 GHz Intel Core i7, 4 core
- Go : 1.13.4
ãã³ããã¼ã¯ã³ã¼ã
以ä¸ãé©å½ã« main_test.go
ã¨ãã¦ããã¾ãã
package main import ( "sync" "testing" ) func BenchmarkMutex(b *testing.B) { var mu sync.Mutex var n int for i := 0; i < b.N; i++ { mu.Lock() n++ mu.Unlock() } } func BenchmarkChan(b *testing.B) { ch := make(chan struct{}, 1) var n int for i := 0; i < b.N; i++ { ch <- struct{}{} n++ <-ch } } func BenchmarkMultiMutex(b *testing.B) { var mu sync.Mutex var n int var wg sync.WaitGroup wg.Add(10) for j := 0; j < 10; j++ { go func() { for i := 0; i < b.N; i++ { mu.Lock() n++ mu.Unlock() } wg.Done() }() } wg.Wait() } func BenchmarkMultiChan(b *testing.B) { ch := make(chan struct{}, 1) var n int var wg sync.WaitGroup wg.Add(10) for j := 0; j < 10; j++ { go func() { for i := 0; i < b.N; i++ { ch <- struct{}{} n++ <-ch } wg.Done() }() } wg.Wait() }
BenchmarkMulti****()
ã¯ã10 ã® goroutine ã§åæã«åãããã®ã§ãã
çµæ
GOMAXPROCS=1
ã§ãããªã£ããã®ãããã§ãã
$ GOMAXPROCS=1 GO111MODULE=off go test -bench . goos: darwin goarch: amd64 BenchmarkMutex 100000000 10.4 ns/op BenchmarkChan 28564992 40.5 ns/op BenchmarkMultiMutex 9439315 126 ns/op BenchmarkMultiChan 1000000 1189 ns/op PASS ok _/Users/kawasin73/work/sample-go/rwlock 4.808s
æ®éã®ãã«ãã¹ã¬ããã§ãããªã£ããã®ãããã§ãã
$ GO111MODULE=off go test -bench . goos: darwin goarch: amd64 BenchmarkMutex-8 100000000 10.7 ns/op BenchmarkChan-8 27600146 42.3 ns/op BenchmarkMultiMutex-8 2536651 494 ns/op BenchmarkMultiChan-8 736453 1710 ns/op PASS ok _/Users/kawasin73/work/sample-go/rwlock 5.307s
ã¾ã¨ã
sync.Mutex
ã®æ¹ããã£ãã«ããã ããã 4 åéãã§ãããã£ãã«ã¯å
é¨ã§ããã¯ãåã£ãä¸ã§ãã«ããã«ããã£ã¦ããã®ã§é
ãã®ã¯å½ããåã§ãã
ã¾ããã·ã³ã°ã«ã¹ã¬ããã«ããã¨ã¹ã¬ããå士ã®å¾ ã¡åãããç¡ããªã£ããã·ã³ã°ã«ã¹ã¬ããç¨ã®æé©åãããã®ãã©ããã¯ãããã¾ããããéããªãã¾ããéããªãã¨ããããã¯ããã«ãã¹ã¬ããã§åããã¨é ããªãã¨ãã表ç¾ã®æ¹ãçè§£ãããããã§ããã
ã·ã³ãã«ãªææ ¼å¯è½ãª RWMutex
ãä½ãåã«ã¯ sync.Mutex
ãä½¿ãæ¹åã§ã§ãããã§ãã
ãã ãã¿ã¤ã ã¢ã¦ããããããã¨ãã㨠Go ã§ã¯å¿ ããã£ãã«ã使ããªãã¨ãããªããªããããªã®ãæ®å¿µã§ãã