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
golang 实现菜单树的生成方式
Apr 28 Golang
goland设置颜色和字体的操作
May 05 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Golang的继承模拟实例
Jun 30 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
入门学习Go的基本语法
Jul 07 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang为什么要统一错误处理
Apr 03 Golang
Golang数据类型和相互转换
Apr 12 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
第十节--抽象方法和抽象类
2006/11/16 PHP
火车头采集器3.0采集图文教程
2007/03/17 PHP
php+mysql事务rollback&amp;commit示例
2010/02/08 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
js Math 对象的方法
2013/09/01 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
详解ES6中class的实现原理
2020/10/03 Javascript
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python制作简易注册登录系统
2016/12/15 Python
Python常见异常分类与处理方法
2017/06/04 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
python双向链表原理与实现方法详解
2019/12/03 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
什么是python类属性
2020/06/10 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
大一学生职业生涯规划
2014/03/11 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang