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各时间字符串使用解析
Apr 02 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
golang 实现时间戳和时间的转化
May 07 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
Golang数据类型和相互转换
Apr 12 Golang
golang使用map实现去除重复数组
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
Go web入门Go pongo2模板引擎
May 20 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中jsonp的跨域实例
2013/06/21 PHP
php+ajax登录跳转登录实现思路
2016/07/31 PHP
深入研究PHP中的preg_replace和代码执行
2018/08/15 PHP
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python实现程序的单一实例用法分析
2015/06/03 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
Python数据类型之List列表实例详解
2019/05/08 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
python中open函数的基本用法示例
2019/09/07 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
Python内置函数及功能简介汇总
2020/10/13 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
八年级物理教学反思
2014/01/19 职场文书
团队队名口号大全
2014/06/06 职场文书
校庆团日活动总结
2014/08/28 职场文书
教代会闭幕词
2015/01/28 职场文书