GoLang Channel与mutex的选择,性能差不多

toontong · · 4025 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

go官方应该是更推荐使用chan
https://github.com/golang/go/wiki/MutexOrChannel

以下代码用于测试性能 — 不确保思路是正确的。

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\n", time.Now())
    }
    lock.Unlock()
}

var ch chan Op

func update_map_by_chan(i int) {
    ch <- Op{key: i, val: i}
}

func wait_for_chan(m map[int]int) {
    for {
        select {
        case op := <-ch:
            m[op.key] = op.val
            if len(m2) == max {
                fmt.Printf("%s chan finish\n", 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化,更推荐。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:toontong

查看原文:GoLang Channel与mutex的选择,性能差不多

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4025 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传