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中切片copy复制和等号复制的区别介绍
Apr 27 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
golang elasticsearch Client的使用详解
May 05 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
Golang的继承模拟实例
Jun 30 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang 实现WebSockets
Apr 24 Golang
Golang 入门 之url 包
May 04 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Go gRPC进阶教程gRPC转换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
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
jQuery下的动画处理总结
2013/10/10 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
如何使用localstorage代替cookie实现跨域共享数据问题
2018/04/18 HTML / CSS
爱普生美国官网:Epson美国
2018/11/05 全球购物
消防先进事迹材料
2014/02/10 职场文书
师范生自我鉴定
2014/03/20 职场文书
设计师求职信
2014/07/01 职场文书
大学生见习报告范文
2014/11/03 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
归元寺导游词
2015/02/06 职场文书