本節主要記錄golang測試代碼、查看代碼性能、優化代碼的相關操作編寫工具用的是vscode
下面是此次測試的代碼:
package main_test
import (
"testing"
)
func BenchmarkTest(b *testing.B) {
str := "dewfewfewgthre"
n := 7
for i := 0; i < b.N; i++ {
if actual := lengthOfNoRepeatingSubStr(str); actual != n {
b.Errorf("got %d for input %s; expected %d", actual, str, n)
}
}
}
//求最大不重複子字符串的長度
func lengthOfNoRepeatingSubStr(str string) int{
lastOccurred := make(map[rune]int)
start := 0
maxLength := 0
for i, ch := range []rune(str){
if lastI, ok := lastOccurred[ch]; ok && lastI >= start{
start = lastI + 1
}
if i - start + 1 > maxLength{
maxLength = i - start + 1
}
lastOccurred[ch] = i
}
return maxLength
}
具體步驟如下:
1、創建一個新目錄,新建go代碼腳本,腳本名需要帶test,如:profiler_test.go;
2、寫一個測試的函數;
3、新建以Benchmark開頭的函數,在新建的函數裏調用測試的函數,調用次數是由testing.B裏的N字段控制,即上述代碼中的循環次數:b.N;b.ResetTimer()可以重置計時器;
4、開始調試,在terminal終端進行調試:
①、輸入go test -bench .
可查看循環調用了測試代碼的次數以及每次調用測試代碼耗費的時間。
運行結果如下:
E:\Go\src\TestProfilerProject>go test -bench .
goos: windows
goarch: amd64
pkg: TestProfilerProject
BenchmarkTest-4 3000000 413 ns/op
PASS
ok TestProfilerProject 1.805s
②、輸入go test -bench . -cpuprofile cpu.out
可以把運行代碼過程的各種信息輸出到cpu.out文件中,生成的cpu.out跟代碼目錄同級
運行結果如下:
E:\Go\src\TestProfilerProject>go test -bench . -cpuprofile cpu.out
goos: windows
goarch: amd64
pkg: TestProfilerProject
BenchmarkTest-4 3000000 421 ns/op
PASS
ok TestProfilerProject 2.214s
③、輸入go tool pprof cpu.out
由於第②步生成的cpu.out是一個二進制文件,我們無法直接查看其信息,所以要執行這一步的命令,這個命令執行後提供一個交互式接口,我們可以輸入指定的命令來完成相關的操作
運行結果如下:
E:\Go\src\TestProfilerProject>go tool pprof cpu.out
Type: cpu
Time: Jul 31, 2019 at 4:37pm (CST)
Duration: 1.90s, Total samples = 1.71s (89.93%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)
執行後輸出末尾會進入等待輸入狀態,爲了查看cpu.out的具體內容,我們需要藉助Graphviz 軟件讓這些信息可視化。
Graphviz 的安裝可參考:https://www.cnblogs.com/shuodehaoa/p/8667045.html
④、輸入dot
得到dot代碼,把這些代碼複製到Graphviz軟件中即可生成我們的測試代碼運行信息圖,代碼哪些地方消耗性能較多、佔用的時間較多都一目瞭然。