问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用benchmark+pprof分析Go程序性能

发布网友 发布时间:2024-10-04 03:26

我来回答

1个回答

热心网友 时间:2024-11-16 00:59

benchmark对程序进行基准测试:Benchmark

代码如下:

packageaesimport("bytes""crypto/aes""crypto/cipher""encoding/base64""fmt""log""os""testing")funcAesEncryptA(aesKey,IV,origin[]byte)[]byte{block,err:=aes.NewCipher(aesKey)iferr!=nil{returnnil}blocksize:=block.BlockSize()blockMode:=cipher.NewCBCEncrypter(block,IV)originData:=PKCS5Padding(origin,blocksize)crypted:=make([]byte,len(originData))blockMode.CryptBlocks(crypted,originData)returncrypted}funcAesEncryptB(aesKey,IV,origin[]byte)[]byte{block,err:=aes.NewCipher(aesKey)iferr!=nil{returnnil}blocksize:=block.BlockSize()blockMode:=cipher.NewCBCEncrypter(block,IV)originData:=PKCS5Padding(origin,blocksize)crypted:=make([]byte,len(originData))blockMode.CryptBlocks(crypted,originData)//把加密结果打印到日志看看f,_:=os.Create("temp.log")deferf.Close()log.SetOutput(f)log.Println(fmt.Sprintf("encryptresis%s",base64.StdEncoding.EncodeToString(crypted)))returncrypted}/**PKCS5包装*/funcPKCS5Padding(cipherText[]byte,blockSizeint)[]byte{padding:=blockSize-len(cipherText)%blockSizepadText:=bytes.Repeat([]byte{byte(padding)},padding)returnappend(cipherText,padText...)}/*解包装*/funcPKCS5Trimming(encrypt[]byte)[]byte{padding:=encrypt[len(encrypt)-1]returnencrypt[:len(encrypt)-int(padding)]}funcBenchmarkAesEncryptB(b*testing.B){aesKey:=[]byte("1234567890abcdef")IV:=[]byte("7878676756564545")originData:=bytes.Repeat([]byte{28},1<<29)b.ResetTimer()fori:=0;i<b.N;i++{AesEncryptB(aesKey,IV,originData)}}

命令执行:

gotest-benchBenchmarkAesEncryptB-runnone-benchmem-cpuprofilecpuprofile.out-memprofilememprofile.out

命令解释:

bench表示执行某些基准测试函数,后面加需要执行的基础测试函数名称,也可以加.表示执行所有基准测试函数,(-bench可以跟正则表达式)

run表示执行某些单元测试和示例测试函数,一般加none,表示都不执行

benchmem表示打印机执行过程中的内存分配

cpuprofile表示全过程的CPU写到文件cpuprofile.out中

memprofile表示全过程的内存数据行动一些该要数据写到文件。memprofile.out中

执行结果:

goos:darwingoarch:amd64pkg:code.xxxx.org/xxxx.hit/GoProject/main/gobase/aescpu:Intel(R)Core(TM)i7-9750HCPU@2.60GHzBenchmarkAesEncryptB-1213597342551ns/op6218809432B/op51allocs/opPASSokcode.xxxx.org/xxxx.hit/GoProject/main/gobase/aes4.214s

上述执行结果可以看到:

从执行结果中能看到,for循环每执行一次,耗时3597342551纳秒,同时会有55次内存分配操作,每次操作6218809432字节。

pprof分析CPU

pprof是go中自带的分析CPU分析器,常用来分析性能瓶颈

pprof既可以通过命令行交互的方式查看CPU(内存)的概要数据,也可以通过web的方式查看直观的图形化展示。这里我们主要通过web的方式来展示。

当然,使用pprof工具前,你需要先安装graphviz,如果是mac,执行brewinstallgraphviz

使用pprof分析CPU

执行如下命令:

gotoolpprof-http=":8081"cpuprofile.out

然后通过访问地址http://localhost:8081/ui/能看到

可以看到加密部分用了2.64s其中加密用了0.67s,日志打印和字符串转化用了0.41+0.86s。

用pprof分析内存gotoolpprof-http=":8081"memprofile.out

通过地址http://localhost:8081/ui/能看到

可以看到总共用了5930.71MB,实际上加密用值用了640MB上,可以看到其他内存耗费在fmt和log打印上了

AesEncryptA对于AesEncryptB的优化funcBenchmarkAesEncryptA(b*testing.B){aesKey:=[]byte("1234567890abcdef")IV:=[]byte("7878676756564545")originData:=bytes.Repeat([]byte{28},1<<29)b.ResetTimer()fori:=0;i<b.N;i++{AesEncryptA(aesKey,IV,originData)}}funcBenchmarkAesEncryptB(b*testing.B){aesKey:=[]byte("1234567890abcdef")IV:=[]byte("7878676756564545")originData:=bytes.Repeat([]byte{28},1<<29)b.ResetTimer()fori:=0;i<b.N;i++{AesEncryptB(aesKey,IV,originData)}}

执行命令:

gotest-bench.-runnone-benchmem-cpuprofilecpuprofile.out-memprofilememprofile.out

执行结果:

goos:darwingoarch:amd64pkg:code.xxxx.org/xxxx.hit/GoProject/main/gobase/aescpu:Intel(R)Core(TM)i7-9750HCPU@2.60GHzBenchmarkAesEncryptA-1211011892174ns/op1207970544B/op16allocs/opBenchmarkAesEncryptB-1213382908467ns/op6218813680B/op54allocs/opPASSokcode.xxxx.org/xxxx.hit/GoProject/main/gobase/aes5.014s

可以看到BenchmarkAesEncryptA每次循环消耗1011892174ns每次操作1207970544B内存,比BenchmarkAesEncryptB每次循环消耗3382908467ns,每次操作6218813680B内存,可以看到得到了很大的改善,区别主要是去掉了一些日志打印的结果。

总结

可以借助benchmark进行基准测试,跑出cpuprofile.out和memprofile.out,然后利用pprof进行cpu和内存分析

作者:banjming著作权归作者所有。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑docx怎么转换成word文档电脑上docx格式文件转换方法 电脑白屏是怎么回事啊。??? 电脑开机花屏渐渐地白屏了显示器突然白屏花屏的原因及解决方法_百度知 ... iphone录屏失败因为5823什么意思_iphone录屏失败提示5823代表什么意思... 软考中级:信息安全工程师 求大神解答打印机如何设置默认双面打印 如何更改打印机的打印格式? 经期同房月经没了会怀孕吗 iphone8p轻触解锁设置 宝沃bx5300公里多少油钱 抖音想开直播卖衣服怎么弄?需要什么设备? 直播卖衣服有什么技巧 关于QQ游戏斗地主赠送好友游戏道具的问题 李清照一剪梅改写作文 坚持全面从严治党 信息报告显示---“未发送至” 人这一生会遇到多少个坎? 创业要低调,首先要把自己经营好 有关全球通 海尔BCD-248WBCX质量怎么样 同是北京动感地带,打电话如果对方关机,停机,正在通话中或不在服务区... 海尔BCD-248WBCS重要参数 ...写的关于思念家乡亲人的诗句有哪些(思念家乡思念亲人的古诗50首) 海尔冰箱248WBCX冷藏室底部的抽屉盒上的档位怎么调节? 福建省打击“三假”等恶性欺诈骗保行为成效明显 平安福保险怎么样?平安保险平安福全面测评 &gt;如何分辨“颈椎病”是真是假?! 中医颈椎自我调筋术 武国忠养生精髓七讲小说txt全集免费下载 如何删除excel中的空白单元格呢? 请问一个建设500mw的EPc建设需要多少钱火电厂 2023教师节祝福语30字以内 家长给教师节祝福语30字怎么写 2022教师节祝福语30字 60kw电厂需要投资多少 ...买的华硕P552sj结果玩联盟都卡本想买个飞行堡垒。在线急等大神回复说... 2023年教师节祝福语30字大全 性能小课堂:Jmeter录制手机app脚本 什锦烩菜的做法 大暑前后的钓鱼技巧 大暑下大雨后如何钓鱼 ...小时等我发现的时候衣服上有很多紫色的东西怎么洗也洗不掉?_百度知... ...有两三天了,昨天洗的时候才发现,清洗之后还是有印记,怎么办... 别人介绍了一女朋友老家的,没有见过面,只是电话联系,我感觉我很喜欢她... 针灸推拿学的就业前景如何? 我现在在自学编程,准备先考个证书什么的,据说计算机二级考试是考c语言... 用SSH做一个新闻系统,有一点儿功能有问题,就是一篇新闻的评论_百度知 ... ssh框架做的信息系统,怎么刚进入网页就提示出有几条新信息?用hql语句... 寒灵之剑宠物获得方法介绍_寒灵之剑宠物获得方法是什么 ssh集成开发一个项目,整个系统的权限管理常用的实现方式有哪些啊?