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 相关文章推荐
golang在GRPC中设置client的超时时间
Apr 27 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
golang elasticsearch Client的使用详解
May 05 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
golang 实现并发求和
May 08 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
深入理解go slice结构
Sep 15 Golang
golang为什么要统一错误处理
Apr 03 Golang
Golang 字符串的常见操作
Apr 19 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 管理系统程序中的后门
2009/08/05 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
2009/11/30 PHP
php实现单链表的实例代码
2013/03/22 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
小议Javascript中的this指针
2010/03/18 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
js实现转动骰子模型
2019/10/24 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
Python 如何创建一个简单的REST接口
2020/07/30 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
学生会竞选自荐信
2013/10/12 职场文书
应聘美工求职信
2013/11/07 职场文书
电脑饰品店的创业计划书
2014/01/21 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
隐形的翅膀观后感
2015/06/10 职场文书