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:垃圾回收GC触发条件详解
Apr 24 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
Go使用协程交替打印字符
Apr 29 Golang
解决Go gorm踩过的坑
Apr 30 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
Golang二维数组的使用方式
May 28 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang日志包的使用
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 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中养成7个面向对象的好习惯
2010/07/17 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
Jquery 实现表格颜色交替变化鼠标移过颜色变化实例
2013/08/28 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
python实现的jpg格式图片修复代码
2015/04/21 Python
python实现八大排序算法(2)
2017/09/14 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
python输出pdf文档的实例
2020/02/13 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
SkinCeuticals官网:美国药妆品牌
2018/04/19 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
怎么处理XML的中文问题
2015/03/26 面试题
电子信息工程自荐信
2014/05/26 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
长城的导游词
2015/01/30 职场文书
任命通知范文
2015/04/21 职场文书
教师培训学习心得体会
2016/01/21 职场文书
Django程序的优化技巧
2021/04/29 Python
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers
nginx 配置缓存
2022/05/11 Servers