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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
golang 实现并发求和
May 08 Golang
Golang全局变量加锁的问题解决
May 08 Golang
go 实现简易端口扫描的示例
May 22 Golang
入门学习Go的基本语法
Jul 07 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang Elasticsearches 批量修改查询及发送MQ
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 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
JavaScript 事件系统
2010/07/22 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
Javascript技术栈中的四种依赖注入详解
2016/02/23 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
Python实现的knn算法示例
2018/06/14 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
澳大利亚宠物食品和用品商店:PETstock
2020/01/02 全球购物
如何利用find命令查找文件
2016/11/18 面试题
建筑公司文秘岗位职责
2013/11/29 职场文书
公务员保密承诺书
2014/03/27 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python
一文搞懂php的垃圾回收机制
2021/06/18 PHP
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js
JAVA springCloud项目搭建流程
2022/05/11 Java/Android