发布网友 发布时间: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分析CPUpprof是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著作权归作者所有。