Golang的ch和mutex小试

Golang崇尚channel解决跨goroutine中的变量共享问题,那么到底效率如何,我们简单测试一下

package main
import (
“fmt”

"sync"

"time"

)
var count int = 100000

//锁的例子

func lockTest() {
list := make([]int, 0)
var mutex sync.RWMutex

lock := func(i int) {
    mutex.Lock()
    list = append(list, i)
    mutex.Unlock()
}
now := time.Now().UnixNano()
for i := 0; i < count; i++ {
    go lock(i)
}
for {
    if len(list) == count {
        break

    }
}
fmt.Println(fmt.Sprintf("lock %d ms", (time.Now().UnixNano()-now)/(1000*1000)))

}

//ch 例子

func chTest() {
list := make([]int, 0)
ch := make(chan int)
chGo := func(chs chan int, i int) {
chs <- i
}
now := time.Now().UnixNano()
for i := 0; i < count; i++ {
go chGo(ch, i)
}
for {
list = append(list, <-ch)
if len(list) == count {
break

    }
}
fmt.Println(fmt.Sprintf("channel %d ms", (time.Now().UnixNano()-now)/(1000*1000)))

}

func main() {
lockTest()
chTest()
}

我们看下运行结果

c:/go/bin/go.exe build -i [D:/golang]

成功: 进程退出代码 0.

D:/golang/golang.exe [D:/golang]

lock 55 ms
channel 455 ms
成功: 进程退出代码 0.

使用锁的方式,大概是channel的10倍,当然这个例子比较极端,使用channel固然好,不过似乎性能没锁高

下面我们试试带缓冲区的锁

package main

import (
“fmt”

"sync"

"time"

)

var count int = 100000

//锁的例子

func lockTest() {
list := make([]int, 0)
var mutex sync.RWMutex

lock := func(i int) {
    mutex.Lock()
    list = append(list, i)
    mutex.Unlock()
}
now := time.Now().UnixNano()
for i := 0; i < count; i++ {
    go lock(i)
}
for {
    if len(list) == count {
        break

    }
}
fmt.Println(list[:10])
fmt.Println(fmt.Sprintf("lock %d ms", (time.Now().UnixNano()-now)/(1000*1000)))

}

//ch 例子

func chTest() {
list := make([]int, 0)
ch := make(chan int, 100000)
chGo := func(chs chan int, i int) {
chs <- i
}
now := time.Now().UnixNano()
for i := 0; i < count; i++ {
go chGo(ch, i)
}
for {
list = append(list, <-ch)
if len(list) == count {
break

    }
}
fmt.Println(list[:10])
fmt.Println(fmt.Sprintf("channel %d ms", (time.Now().UnixNano()-now)/(1000*1000)))

}

func main() {
lockTest()
chTest()
}
运行结果:
c:/go/bin/go.exe build -i [D:/golang]

成功: 进程退出代码 0.

D:/golang/golang.exe [D:/golang]

[1 0 4 3 6 5 8 7 10 9]
lock 55 ms
[7 0 1 2 3 4 5 25 8 9]
channel 77 ms
成功: 进程退出代码 0.

结果还是锁略快一点