Buffered channel、slice和mutex的简单性能测试
时间:2022-05-05
本文章向大家介绍Buffered channel、slice和mutex的简单性能测试,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
测试代码:
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("channeltslicetmutex_slice")
for i := 0; i < 10; i++ {
fmt.Printf("%vt%vt%vn", bench1(ch), bench2(s), bench3(s, &mutex))
}
}
测试环境
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定位性能瓶颈而不是单纯的想象。
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)
- objective-C中如何判断一个类中有没有定义某个方法
- Steve Boswell:智能口罩让PM2.5滚蛋
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(2)
- objective-C中的扩展方法与partial class
- 仿优酷Android客户端图片左右滑动(自动滑动)
- objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?
- objective-C 的内存管理之-实例分析
- Tim Berners-Lee:网络的自由和开放
- android防止内存溢出浅析
- objective-C 的内存管理之-自动释放池(autorelease pool)
- objective-C 的内存管理之-引用计数
- CompoundButton.OnCheckedChangeListener与RadioGroup.OnCheckedChangeListener冲突
- Liora Rosin & Golan Levi:在北京驾车看洛杉矶的落日
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅析MySQL存储引擎序列属性
- 详述MySQL Using intersect交集算法
- 案例:强制开库遭遇ORA-16433的处理过程
- 叮~AutoML自动化机器学习入门指南,来了
- 注意:ORACLE 11G ADG RAC 这个情况下并不能高可用
- Nginx转发指向数据库端口并对外开放访问权限
- Python手写了 35 种可解释的特征工程方法
- Geant4--G4ParticleGun定义射线源的发射能谱
- Sony-PMCA-RE, 反向工程索尼PlayMemories相机应用
- 中标麒麟系统Your trial is EXPIRED and no VALID licens
- R初探
- 独家 | 在Python编程面试前需要学会的10个算法(附代码)
- 为什么一个还没毕业的大学生能够把 IO 讲的这么好?
- 如何将单 master 升级为多 master 集群
- 为 Kubernetes 节点发布扩展资源