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 28 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
Go语言编译原理之源码调试
Aug 05 Golang
基于Python实现西西成语接龙小助手
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
开发大型PHP项目的方法
2006/10/09 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
JS功能代码集锦
2016/05/04 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
Python列表list数组array用法实例解析
2014/10/28 Python
用Python创建声明性迷你语言的教程
2015/04/13 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
python nmap实现端口扫描器教程
2020/05/28 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
宣传部部长竞选演讲稿
2014/04/26 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
期中考试后的感想
2015/08/07 职场文书