golang 代码测试与性能分析
平时我写一些方法,需要测试,一般是在main函数上测试,这样很不友好,goland为我准备了测试用的包 test ,下面是个列子
1.1列子
demo
func lengthOfNonRepeatingSubStr(s string) int {
lastOccurred := make(map[rune]int)
start := 0
maxLength := 0
for i, ch := range []rune(s) {
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
}
func main() {
fmt.Println(
lengthOfNonRepeatingSubStr("abcabssssdsdsfscbb"))
fmt.Println(
lengthOfNonRepeatingSubStr(
"航天工业发展股份有限公司紧围绕"))
}
一 测试结果
表格测试
func BenchmarkSubstr(b *testing.B) {
s := "航天工业发展股份有限公司紧围绕"
for i := 0; i < 13; i++ {
s = s + s
}
b.Logf("len(s) = %d", len(s))
ans := 8
b.ResetTimer()
for i := 0; i < b.N; i++ {
actual := lengthOfNonRepeatingSubStr(s)
if actual != ans {
b.Errorf("got %d for input %s; "+
"expected %d",
actual, s, ans)
}
}
}
IDE结果
BenchmarkSubstr
BenchmarkSubstr-4 129 9068571 ns/op
b.ResetTimer()这段代码的意思是测试时,字符串拼接的时间不算在里面
如果你觉得代码写的不过好,可以吧上面的map改变成切片,但切片的创建最好是放在外面,这样可以减少垃圾回收的性能
var lastOccurred = make([]int,0xffff)
func lengthOfNonRepeatingSubStr2(s string) int {
for i:=range lastOccurred{
lastOccurred[i]=0
}
start := 0
maxLength := 0
for i, ch := range []rune(s) {
if lastI:= lastOccurred[ch]; lastI > start {
start = lastI
}
if i-start+1 > maxLength {
maxLength = i - start + 1
}
lastOccurred[ch] = i+1
}
return maxLength
}
二生成代码性能PDF
命令
1 先使用命令 go test -bench . -cpuprofile cpu.out 输出文件cpu.out
2 再运行 go tool pprof cpu.out 安提示输入web
3 退出 quit
注:如无法输出,请先安装graphviz
graphviz官方网址 http://www.graphviz.org/download