聊聊Golang中的锁(1)–可能造成较高的CPU消耗
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc
前言
关于Golang中的锁的实现和源码早就文章阐述过了,这里我从实验的角度让大家看看对协程数量对任务执行速度,以及CPU开销的影响
运行环境
CPU
: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz 8核
内存
:16G
GO version
1.10
协程数量分别是1, 2, 5, 10, 100, 200下完成1000000000次计数所花
总时间
CPU消耗
CPU峰值
分析
观察图可以发现,
1) 协程数量是1的时候运行总时间反而最短,只耗时2.8秒,协程数量10时,运行总时间最长,耗时21.6秒
2) 协程数量是100时,CPU峰值最大,为530%,协程数量是1是,CPU峰值最小,不到100%
代码
package main
import (
"fmt"
"sync"
"time"
)
type LockBox struct{
sync.Mutex
Value int
}
func deal(wpg *sync.WaitGroup, bp *LockBox, count int){
for i:=0;i< count;i++{
bp.Lock()
bp.Value++
bp.Unlock()
}
wpg.Done()
}
func main() {
timeStart := time.Now()
//workerCount := 1
//workerCount := 2
workerCount := 200
taskCount := 1000000000
var wg sync.WaitGroup
var box LockBox
for i:=0;i<workerCount;i++{
wg.Add(1)
go deal(&wg, &box, taskCount/workerCount)
}
wg.Wait()
fmt.Println("cost", time.Since(timeStart))
}