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语言使用select{}阻塞main函数介绍
Apr 25 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
go xorm框架的使用
May 22 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
入门学习Go的基本语法
Jul 07 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Go语言grpc和protobuf
Apr 13 Golang
golang生成并解析JSON
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 20 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中批量替换文件名的实现代码
2011/07/20 PHP
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
js的写法基础分析
2011/01/17 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
jquery实现广告上下滚动效果
2021/03/04 jQuery
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
详解python pandas 分组统计的方法
2019/07/30 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
2020/01/03 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
细说NumPy数组的四种乘法的使用
2020/12/18 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
《骆驼和羊》教学反思
2014/02/27 职场文书
公共场所禁烟标语
2014/06/25 职场文书