如何使用`go test`来定时和描述golang中程序的* section *?

时间:2016-10-19 19:28:09

标签: go profiling

问题:如何使用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.pdfgo 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,所以我可以修改时序行为?

具体问题

  1. 如何仅将go test用于个人资料仅限我当前测试用例的最后三行?
  2. 如何仅将go test 时间用于当前测试用例的最后三行?

1 个答案:

答案 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()