【问题标题】:How to test Go function execution time using standard lib如何使用标准库测试 Go 函数执行时间
【发布时间】:2018-03-12 07:49:12
【问题描述】:

我编写了以下函数,当与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)
}

【问题讨论】:

标签: go


【解决方案1】:

使用 Go testing 包。例如,

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)
        }
    }
}

输出:

$ go test -bench=. -benchmem
goos: linux
goarch: amd64
pkg: main
BenchmarkStuff-4    20000000    83.1 ns/op    48 B/op    1 allocs/op

【讨论】:

    【解决方案2】:

    你可以使用测试

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

    【讨论】:

      【解决方案3】:

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

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

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

        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()
            }
        }
        
      3. 打开终端,执行以下命令:

        go test -bench .
        
      4. 你会看到这样的输出:

        goos: darwin
        goarch: amd64
        BenchmarkFunc-2      5000000           360 ns/op         120 B/op          4 allocs/op
        PASS
        ok      command-line-arguments  2.190s
        

      【讨论】:

        猜你喜欢
        • 2019-10-04
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 2014-07-28
        相关资源
        最近更新 更多