正确处理Golang 竞争资源,提高性能

竞争资源是多个goroutine 在没有相互同步的情况下,访问某个共享的资源,也叫竞态资源。 比如同时对该资源进行读写时,就会处于相互竞争的状态,这就是并发中的资源竞争。对竞争资源处理不当时会有性能损耗,也可能会引起其它问题。

可以用 Race Detector (竞态分析)来找到竞态资源,工具的使用方法就是在go test/build 后加上-race标志

$ go test -v -race
$ go build -race

静态资源有多种同步机制:

  • 使用channel
  • 使用Mutex
  • 使用atomic
  • 使用unsafe.Pointer

性能上 atomic 和 unsafe.Pointer 差不多,Mutex 较慢,channel 最慢。

下面是atomic、unsafe.Pointer、Mutex 的比较结果:

$ go version
go version go1.10 darwin/amd64
$ go test -bench .
goos: darwin
goarch: amd64
BenchmarkPointer-8   	100000000	        12.2 ns/op
BenchmarkValue__-8   	100000000	        14.6 ns/op
BenchmarkRWMutex-8   	 5000000	       302 ns/op

go1.10 后atomic 改变了不少,跟unsafe.Pointer 相差很小。

本文网址: https://www.golangnote.com/topic/225.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。