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如何替换某个文件中的字符串
Apr 25 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Go 语言结构实例分析
Jul 04 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang使用map实现去除重复数组
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Go语言入门exec的基本使用
May 20 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go语言怎么使用变长参数函数
Jul 15 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
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
2010/02/09 PHP
php连接mssql数据库的几种方法
2013/02/21 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
python获取豆瓣电影简介代码分享
2014/01/16 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
数据库基础的一些面试题
2012/02/25 面试题
大学四年职业生涯规划书范文
2014/01/02 职场文书
学校大课间活动方案
2014/01/30 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
项目申请汇报材料
2014/08/16 职场文书
2014年信用社工作总结
2014/11/25 职场文书
婚宴邀请函
2015/01/30 职场文书
个性与发展自我评价
2015/03/06 职场文书
研究生导师推荐信
2015/03/25 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
使用python绘制分组对比柱状图
2022/04/21 Python