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判断key是否在map中的代码
Apr 24 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
go类型转换及与C的类型转换方式
May 05 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
golang中的struct操作
Nov 11 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
golang定时器
Apr 14 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 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代码
2006/12/06 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
Nodejs模块载入运行原理
2018/02/23 NodeJs
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
详解vue3.0 diff算法的使用(超详细)
2020/07/01 Javascript
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Django admin组件的使用
2020/10/24 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
毕业生优秀推荐信
2013/11/26 职场文书
法律进企业活动方案
2014/03/04 职场文书
房屋买卖协议书
2014/04/10 职场文书
团日活动总结范文
2014/04/25 职场文书
2014党员民主评议个人总结
2014/09/10 职场文书
副总经理党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/06 职场文书
电影地道战观后感
2015/06/04 职场文书
MySQL事务的ACID特性以及并发问题方案
2022/07/15 MySQL