GoLang Channelとmutexの選択、性能は多くありません
3164 ワード
go公式はchanの使用をもっとお勧めするはずですhttps://github.com/golang/go/wiki/MutexOrChannel
次のコードは、パフォーマンスをテストするために使用されます.考え方が正しいことは保証されません.
出力結果:
2015-11-17 17:08:18.06992 +0800 CST mutex finish 2015-11-17 17:08:18.0709215 +0800 CST chan finish
mutexは性能はやや良いが、chanはよりgo化され、より推奨されている.
次のコードは、パフォーマンスをテストするために使用されます.考え方が正しいことは保証されません.
package main
import (
"fmt"
"sync"
"time"
)
type Op struct {
key int
val int
}
var lock sync.Mutex
var m1 map[int]int
var m2 map[int]int
var max int = 50000
func update_map_by_mutex(i int) {
lock.Lock()
m1[i] = i
if len(m1) == max {
fmt.Printf("%s mutex finish
", time.Now())
}
lock.Unlock()
}
var ch chan Op
func update_map_by_chan(i int) {
ch func wait_for_chan(m map[int]int) {
for {
select {
case op := if len(m2) == max {
fmt.Printf("%s chan finish
", time.Now())
return
}
}
}
}
func main() {
m1 = make(map[int]int, max)
m2 = make(map[int]int, max)
ch = make(chan Op)
go wait_for_chan(m2)
for i := 0; i < max; i++ {
go update_map_by_chan(i)
go update_map_by_mutex(i)
}
time.Sleep(time.Second * 1)
}
出力結果:
2015-11-17 17:08:18.06992 +0800 CST mutex finish 2015-11-17 17:08:18.0709215 +0800 CST chan finish
mutexは性能はやや良いが、chanはよりgo化され、より推奨されている.