前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Buffered channel、slice和mutex的简单性能测试

Buffered channel、slice和mutex的简单性能测试

作者头像
李海彬
发布2018-03-22 16:26:59
1.3K0
发布2018-03-22 16:26:59
举报
文章被收录于专栏:Golang语言社区Golang语言社区
代码语言:javascript
复制
测试代码:
package main

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)

const COUNT = 1000000

func bench1(ch chan int) time.Duration {
    t := time.Now()
    for i := 0; i < COUNT; i++ {
        ch <- i
    }
    var v int
    for i := 0; i < COUNT; i++ {
        v = <-ch
    }
    _ = v
    return time.Now().Sub(t)
}

func bench2(s []int) time.Duration {
    t := time.Now()
    for i := 0; i < COUNT; i++ {
        s[i] = i
    }
    var v int
    for i := 0; i < COUNT; i++ {
        v = s[i]
    }
    _ = v
    return time.Now().Sub(t)
}

func bench3(s []int, mutex *sync.Mutex) time.Duration {
    t := time.Now()
    for i := 0; i < COUNT; i++ {
        mutex.Lock()
        s[i] = i
        mutex.Unlock()
    }
    var v int
    for i := 0; i < COUNT; i++ {
        mutex.Lock()
        v = s[i]
        mutex.Unlock()
    }
    _ = v
    return time.Now().Sub(t)
}

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    ch := make(chan int, COUNT)
    s := make([]int, COUNT)
    var mutex sync.Mutex
    fmt.Println("channel\tslice\tmutex_slice")
    for i := 0; i < 10; i++ {
        fmt.Printf("%v\t%v\t%v\n", bench1(ch), bench2(s), bench3(s, &mutex))
    }
}
代码语言:javascript
复制

测试环境

CPU: i7-3770

MEMORY: 32G

OS: ubuntu12.04 x86_64

GO VERSION: 1.0.3

输出:

channel

slice

mutex_slice

53.774ms

1.735ms

37.103ms

52.978ms

1.058ms

36.928ms

52.864ms

1.058ms

36.928ms

53.337ms

1.069ms

38.073ms

53.695ms

1.055ms

37.801ms

53.45ms

1.063ms

37.683ms

53.678ms

1.161ms

37.767ms

3.568ms

1.052ms

37.792ms

53.47ms

1.06ms

37.185ms

52.78ms

1.062ms

36.899ms

结论:

在没有竞争的情况下,缓冲信道比线程锁稍慢,但执行时间是直接对数组读写的40~50倍。

引申:

对于之前的提到的内存分配器,或者其他类型的资源分配器,如果频繁调用的话,还是限制在goroutine内存分配器更合适。应该尽量避免在goroutine间分配资源。当然,实际的性能调整应该基于profile定位性能瓶颈而不是单纯的想象。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档