问题:如何使用go test
在golang中对程序的部分进行计时和分析?
用例:我有一个针对B +树的并发批量操作处理算法。我使用go test
进行分析并与其他基线算法(序列化版本,悲观锁定等)进行比较。对于测试用例设置,我将创建一个包含1M条目的B +树并创建1M操作列表,然后我开始对BulkProcess
这些操作进行实际测试。
func TestInputTreeM1e6N1e6(*testing.T) {
M := 1000000
//Test Preparation 1: Setup the tree
tree := NewTree(cmp)
file1name := "InitalTree_10000000.txt"
testF1, err := os.Open(file1name)
if err != nil {
panic(err)
}
defer testF1.Close()
nums, _ := ReadInts(testF1)
for i, num := range nums {
if i == M {
break
}
tree.Set(Int(num), Int(1))
}
fmt.Println("Tree initialized")
//Test Prepration 2: Initialize operations
N := 1000000
inputs := make([]SearchPair, N)
file2name := "Operations_10000000.txt"
testF2, err := os.Open(file2name)
if err != nil {
panic(err)
}
defer testF2.Close()
var opt string
var num int
var input SearchPair
for i:=0; i < N; i++{
fmt.Fscanf(testF2, "%s %d", &opt, &num)
switch opt {
case "DEL":
input = SearchPair{
opt: DEL, //Operation to be applied
k: Int(num), //k to be operated upon
v: Int(0),
}
case "PUT":
input = SearchPair{
opt: PUT, //Operation to be applied
k: Int(num), //k to be operated upon
v: Int(-1),
}
case "SET":
input = SearchPair{
opt: SET, //Operation to be applied
k: Int(num), //k to be operated upon
v: Int(2),
}
}
inputs[i] = input
}
//Start actual testing
fmt.Println("Start processing...")
tree.BulkProcess(inputs)
fmt.Println("Done")
}
问题:我使用go test -v -cpuprofile cpu.out -memprofile mem.out
来分析BulkProcess
效果,然后使用go tool pprof --pdf ConcurrentBPlusTree.test mem.out > mgraph.pdf
和go tool pprof --pdf ConcurrentBPlusTree.test cpu.out > cgraph.pdf
来查看结果。
目前,go test
似乎正在分析整个测试用例,包括树木构建和操作构建。测试设置期间的文件I / O一直在主导性能,我甚至无法看到实际测试中发生了什么。
另外,go test有这样的输出行
=== RUN TestInputTreeM1e6N1e6
--- PASS: TestInputTreeM1e6N1e6 (63.36s)
是否可以配置计时器,使其仅显示批量处理而非整个案例所花费的时间?我知道b *testing.B
包含b.ResetTimer()
和b.StopTimer()
等API。 *testing.T
是否有类似的API,所以我可以修改时序行为?
具体问题
go test
用于个人资料仅限我当前测试用例的最后三行?go test
时间用于当前测试用例的最后三行?答案 0 :(得分:0)
如果您不想对整个程序进行概要分析,可以使用runtime/pprof
包自行启动和停止CPUProfile:
f, err := os.Create(profileFileName)
if err != nil {
log.Fatal("could not create CPU profile: ", err)
}
if err := pprof.StartCPUProfile(f); err != nil {
log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()