如何使用标准lib测试Go函数执行时间

时间:2018-03-11 13:22:15

标签: go

我编写了以下函数,当与Defer一起使用时肯定会有这个技巧,但是我可以使用标准库中的某些内容吗?我正在寻找类似于Python timeit的东西,我可以直接在shell中使用它?

package main

import (
    "fmt"
    "time"
)

func main() {
    defer timeTrack(time.Now(), "looptest")
    nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    var m []int
    for n := range nums {
        if n%2 == 0 {
            m = append(m, n)
        }
    }
}

func timeTrack(start time.Time, name string) {
    elapsed := time.Since(start)
    fmt.Printf("%s took %s", name, elapsed)
}

3 个答案:

答案 0 :(得分:6)

使用Go testing包。例如,

Java

main.go

package main func doStuff() { nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} var m []int for n := range nums { if n%2 == 0 { m = append(m, n) } } } func main() { doStuff() }

main_test.go

输出:

package main

import "testing"

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

使用基准测试中的信息,可以提高性能。通过使用估计来初始化切片$ go test -bench=. -benchmem goos: linux goarch: amd64 pkg: main BenchmarkStuff-4 5000000 276 ns/op 120 B/op 4 allocs/op 来减少分配的数量和大小。

m

输出:

func doStuff() {
    nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    m := make([]int, 0, len(nums)/2+1)
    for n := range nums {
        if n%2 == 0 {
            m = append(m, n)
        }
    }
}

答案 1 :(得分:4)

您可以使用测试

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

答案 2 :(得分:0)

您可以使用“基准” - 方法:

  1. 将文件命名为%SOMETHING%_test.go

  2. 在其中编写测试,基准测试,示例如下:

    var data = JSON.parse(JSON.stringify(myobj))
    
  3. 打开终端并执行以下命令:

    for (var key in myobj) {
        console.log(myobj[key])
    }
    
  4. 您将看到如下输出:

    package main
    
    import (
        "testing"
    )
    
    func fn() {
        nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
        var m []int
        for n := range nums {
            if n%2 == 0 {
                m = append(m, n)
            }
        }
    }
    
    func BenchmarkFunc(b *testing.B) {
        for i := 0; i < b.N; i++ {
            fn()
        }
    }