注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

Golang的ch和mutex小试  

2016-09-06 22:03:34|  分类: golang |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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.


结果还是锁略快一点

  评论这张
 
阅读(86)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016