GoFrame基于性能测试得知grpool使用场景


Posted in Golang onJune 21, 2022

前言摘要

之前写了一篇 grpool goroutine池详解 | 协程管理 收到了大家积极的反馈,今天这篇来做一下grpool的性能测试分析,让大家更好的了解什么场景下使用grpool比较好。

先说结论

grpool相比于goroutine更节省内存,但是耗时更长;

原因也很简单:grpool复用了协程,减少了协程的创建和销毁,减少了内存消耗;也因为协程的复用,总的goroutine数量更少,导致耗时更多。

测试性能代码

开启for循环,开启一万个协程,分别使用原生goroutine和grpool执行。

看两者在内存占用和耗时方面的差别。

package main
import (
   "flag"
   "fmt"
   "github.com/gogf/gf/os/grpool"
   "github.com/gogf/gf/os/gtime"
   "log"
   "os"
   "runtime"
   "runtime/pprof"
   "sync"
   "time"
)
func main() {
   //接收命令行参数
   flag.Parse()
   //cpu分析
   cpuProfile()
   //主逻辑
   //demoGrpool()
   demoGoroutine()
   //内存分析
   memProfile()
}
func demoGrpool() {
   start := gtime.TimestampMilli()
   wg := sync.WaitGroup{}
   for i := 0; i < 10000; i++ {
      wg.Add(1)
      _ = grpool.Add(func() {
         var m runtime.MemStats
         runtime.ReadMemStats(&m)
         fmt.Printf("运行中占用内存:%d Kb\n", m.Alloc/1024)
         time.Sleep(time.Millisecond)
         wg.Done()
      })
      fmt.Printf("运行的协程:", grpool.Size())
   }
   wg.Wait()
   fmt.Printf("运行的时间:%v ms \n", gtime.TimestampMilli()-start)
   select {}
}
func demoGoroutine() {
   //start := gtime.TimestampMilli()
   wg := sync.WaitGroup{}
   for i := 0; i < 10000; i++ {
      wg.Add(1)
      go func() {
         //var m runtime.MemStats
         //runtime.ReadMemStats(&m)
         //fmt.Printf("运行中占用内存:%d Kb\n", m.Alloc/1024)
         time.Sleep(time.Millisecond)
         wg.Done()
      }()
   }
   wg.Wait()
   //fmt.Printf("运行的时间:%v ms \n", gtime.TimestampMilli()-start)
}
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile `file`")
var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
func cpuProfile() {
   if *cpuprofile != "" {
      f, err := os.Create(*cpuprofile)
      if err != nil {
         log.Fatal("could not create CPU profile: ", err)
      }
      if err := pprof.StartCPUProfile(f); err != nil { //监控cpu
         log.Fatal("could not start CPU profile: ", err)
      }
      defer pprof.StopCPUProfile()
   }
}
func memProfile() {
   if *memprofile != "" {
      f, err := os.Create(*memprofile)
      if err != nil {
         log.Fatal("could not create memory profile: ", err)
      }
      runtime.GC()                                      // GC,获取最新的数据信息
      if err := pprof.WriteHeapProfile(f); err != nil { // 写入内存信息
         log.Fatal("could not write memory profile: ", err)
      }
      f.Close()
   }
}

运行结果

组件 占用内存 耗时
grpool 2229 Kb 1679 ms
goroutine 5835 Kb 1258 ms

总结

goframe的grpool节省内存,如果机器的内存不高或者业务场景对内存占用的要求更高,则使用grpool。

如果机器的内存足够,但是对应用的执行时间有更高的追求,就用原生的goroutine。

更多关于GoFrame性能测试grpool使用场景的资料请关注三水点靠木其它相关文章!


Tags in this post...

Golang 相关文章推荐
为什么不建议在go项目中使用init()
Apr 12 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
go设置多个GOPATH的方式
May 05 Golang
Golang中异常处理机制详解
Jun 08 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
Golang入门之计时器
May 04 Golang
Golang实现可重入锁的示例代码
May 25 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
基于Python实现西西成语接龙小助手
Aug 05 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 Golang
Golang gRPC HTTP协议转换示例
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 #Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 #Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 #Golang
Go调用Rust方法及外部函数接口前置
详解Go语言中配置文件使用与日志配置
Jun 01 #Golang
详解Go语言中Get/Post请求测试
You might like
php下载文件的代码示例
2012/06/29 PHP
php笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
详细解析Python当中的数据类型和变量
2015/04/25 Python
python读写二进制文件的方法
2015/05/09 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
python实现输入数字的连续加减方法
2018/06/22 Python
python中正则表达式与模式匹配
2019/05/07 Python
python实现代码统计程序
2019/09/19 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
python 从list中随机取值的方法
2020/11/16 Python
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
司机工作自我鉴定
2014/09/19 职场文书
广告业务员岗位职责
2015/02/13 职场文书
关于元旦的广播稿2016
2015/12/17 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
vue+springboot实现登录验证码
2021/05/27 Vue.js
Python中的变量与常量
2021/11/11 Python
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL