日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go之Benchmark

發(fā)布時間:2023/12/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go之Benchmark 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概念

基準(zhǔn)測試(benchmark)是 go testing 庫提供的,用來度量程序性能,算法優(yōu)劣的利器。

指定一個時間(默認是1秒),看測試對象在達到時間上限時,最多能被執(zhí)行多少次和在此期間測試對象內(nèi)存分配情況。

?

二、特點

  • 基準(zhǔn)測試的代碼文件必須以_test.go結(jié)尾
  • 基準(zhǔn)測試的函數(shù)必須以Benchmark開頭
  • 基準(zhǔn)測試函數(shù)必須接受一個指向Benchmark類型的指針作為唯一參數(shù)
  • 基準(zhǔn)測試函數(shù)不能有返回值
  • b.ResetTimer是重置計時器,這樣可以避免for循環(huán)之前的初始化代碼的干擾
  • 最后的for循環(huán)很重要,被測試的代碼要放到循環(huán)里
  • b.N是基準(zhǔn)測試框架提供的,表示循環(huán)的次數(shù)
  • ?

    三、常用API

  • b.StopTimer()
  • b.StartTimer()
  • b.ResetTimer()
  • b.Run(name string, f func(b *B))
  • b.RunParallel(body func(*PB))
  • b.ReportAllocs()
  • b.SetParallelism(p int)
  • b.SetBytes(n int64)
  • testing.Benchmark(f func(b *B)) BenchmarkResult
  • ?

    四、操作的命令

    go test -bench=BenchmarkFoo

    go test -bench=.

    // 加上 -bench= 測試名字, .表示運行所有的基準(zhǔn)測試,名字可用正則。

    go test -bench=BenchmarkFoo -benchtime=5s/10000x

    // 加上 -benchtime 設(shè)置時間,s表示秒,x表示執(zhí)行次數(shù)

    go test -bench=BenchmarkFoo -benchtime=5s -count=3

    // 加上 -count 表示幾次測試

    go test -bench=. -benchmem

    // 加上 -benchmem 查看內(nèi)存

    go test -bench=. -benchmem -cpuprofile profile.out

    go test -bench=. -benchmem -memprofile memprofile.out

    go tool pprof profile.out

    go tool pprof memprofile.out

    // 結(jié)合 pprof 輸出查看 cpu和內(nèi)存。

    ?

    五、使用的方式

    串行

    func BenchmarkFoo(b *testing.B) {for i:=0; i<b.N; i++ {dosomething()} }

    并行

    func BenchmarkFoo(b *testing.B) {b.RunParallel(func(pb *testing.PB) {for pb.Next() {dosomething()}}) }

    并行的goroutine個數(shù)是默認等于runtime.GOMAXPROCS(0)。

    釋義:創(chuàng)建P個goroutine之后,再把b.N打散到每個goroutine上執(zhí)行

    增大goroutine的個數(shù),使用 b.SetParallelism(p int)

    func BenchmarkFoo(b *testing.B) { b.SetParallelism(10)b.RunParallel(func(pb *testing.PB) {for pb.Next() {dosomething()}}) }

    // 原理: 最終goroutine個數(shù) = 形參p的值 * runtime.GOMAXPROCS(0)

    numProcs := b.parallelism * runtime.GOMAXPROCS(0)

    ?

    StartTimer()、StopTimer()、ResetTimer()

    init(); // 初始化工作 b.ResetTimer() for i:=0; i<b.N; i++ { dosomething1() } b.StopTimer()otherWork(); // 例如做一些轉(zhuǎn)換工作 b.StartTimer() for i:=0; i<b.N; i++ { dosomething2() }

    方式二

    init(); // 初始化工作 b.ResetTimer() for i:=0; i<b.N; i++ {flag := dosomething()if flag {b.StopTimer()} else {b.StartTimer()} }

    StartTimer()、ResetTimer() 都是記錄當(dāng)前時間為開始時間 和 內(nèi)存分配情況,不過 ResetTimer()多了清空重置操作。

    StopTimer() 累計記錄執(zhí)行的時間(當(dāng)前時間 - 記錄的開始時間),累計記錄內(nèi)存分配次數(shù)和分配字節(jié)數(shù)

    Run()

    表驅(qū)動法

    func BenchmarkRR(b *testing.B) {tests := []struct {keyLength int}{{keyLength: 16},{keyLength: 32},}for _, t := range tests {name := fmt.Sprintf("%vKeyLength", t.keyLength)b.Run(name, func(b *testing.B) {dosomething(b, t.keyLength)})} }

    ?

    六、例子

    fib.go

    // 斐波那契數(shù)列 func fib(n int) int {if n < 2 {return n}return fib(n-1) + fib(n-2) } func sum(a, b int) int {return a + b }

    ?

    fib_test.go

    import "testing" func BenchmarkFib10(b *testing.B) {for n := 0; n < b.N; n++ {fib(10)} } func BenchmarkFib20(b *testing.B) {for n := 0; n < b.N; n++ {fib(20)} } func BenchmarkSum(b *testing.B) {for n := 0; n < b.N; n++ {sum(1, 2)} }

    ?

    使用正則

    使用-benchting

    使用-benchting 的x單位

    使用-count

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的Go之Benchmark的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。