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 interface判断为空nil的实现代码
Apr 24 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
使用golang编写一个并发工作队列
May 08 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Go语言测试库testify使用学习
Jul 23 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项目开发中最常用的自定义函数整理
2010/12/02 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
一个tab标签切换效果代码
2009/03/27 Javascript
javascript 有趣而诡异的数组
2009/04/06 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
JavaScript内核之基本概念
2011/10/21 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
使用js实现数据格式化
2014/12/03 Javascript
jquery搜索框效果实现方法
2015/01/16 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
Python Pandas找到缺失值的位置方法
2018/04/12 Python
python 自动重连wifi windows的方法
2018/12/18 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
python中pop()函数的语法与实例
2020/12/01 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
中式餐厅创业计划书范文
2014/01/23 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
罗马假日观后感
2015/06/08 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
新课程改革心得体会
2016/01/22 职场文书