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

Kim*_*kka 5 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)
}
Run Code Online (Sandbox Code Playgroud)

pet*_*rSO 6

使用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()
}
Run Code Online (Sandbox Code Playgroud)

main_test.go:

package main

import "testing"

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

输出:

$ go test -bench=. -benchmem
goos: linux
goarch: amd64
pkg: main
BenchmarkStuff-4    5000000    276 ns/op    120 B/op    4 allocs/op
Run Code Online (Sandbox Code Playgroud)

使用基准测试中的信息,您可以提高性能.通过使用估计来初始化切片来减少分配的数量和大小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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ go test -bench=. -benchmem
goos: linux
goarch: amd64
pkg: main
BenchmarkStuff-4    20000000    83.1 ns/op    48 B/op    1 allocs/op
Run Code Online (Sandbox Code Playgroud)