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语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
go语言中json数据的读取和写出操作
Apr 28 Golang
golang json数组拼接的实例
Apr 28 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
golang 比较浮点数的大小方式
May 02 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
深入理解 Golang 的字符串
May 04 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
PHP邮件专题
2006/10/09 PHP
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
PHP中list方法用法示例
2016/12/01 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
2013/11/23 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
党员的自我评价范文
2014/01/02 职场文书
计算机个人求职信范例
2014/01/24 职场文书
怎样写好自我评价呢?
2014/02/16 职场文书
贷款担保书范文
2014/05/13 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL