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 27 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
golang内置函数len的小技巧
Jul 25 Golang
golang中的struct操作
Nov 11 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
Go语言编译原理之变量捕获
Aug 05 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
Apache2 httpd.conf 中文版
2006/11/17 PHP
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
Python基于多线程实现ping扫描功能示例
2018/07/23 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
利用python求积分的实例
2019/07/03 Python
python Tensor和Array对比分析
2020/01/08 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
全球精选男装和家居用品:Article
2020/04/13 全球购物
2014年关于两会精神的心得体会
2014/03/17 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
党员群众路线承诺书
2014/05/20 职场文书
环境日宣传活动总结
2014/07/09 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
农村党支部承诺书
2015/04/30 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电