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 08 Golang
Go语言带缓冲的通道实现
Apr 26 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
Go使用协程交替打印字符
Apr 29 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang 字符串的常见操作
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作为Shell脚本语言使用
2006/10/09 PHP
利用 window_onload 实现select默认选择
2006/10/09 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
php实例分享之二维数组排序
2014/05/15 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
js制作的鼠标悬浮时产生的下拉框效果
2012/10/27 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
python3 shelve模块的详解
2017/07/08 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
python挖矿算力测试程序详解
2019/07/03 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
母婴店促销方案
2014/03/05 职场文书
投标承诺书怎么写
2014/05/24 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
python glom模块的使用简介
2021/04/13 Python
Python中super().__init__()测试以及理解
2021/12/06 Python