你如何计时Go中的函数并以毫秒为单位返回其运行时间?

The*_*uma 36 time benchmarking timer go

你如何计时Go中的函数并以毫秒为单位返回其运行时间?

ama*_*ttn 32

Go's defer让这件事变得微不足道.

在Go 1.x中,定义以下函数:

func trace(s string) (string, time.Time) {
    log.Println("START:", s)
    return s, time.Now()
}

func un(s string, startTime time.Time) {
    endTime := time.Now()
    log.Println("  END:", s, "ElapsedTime in seconds:", endTime.Sub(startTime))
}
Run Code Online (Sandbox Code Playgroud)

之后,您将获得Squeaky Clean一行经过时间的日志消息:

func someFunction() {
    defer un(trace("SOME_ARBITRARY_STRING_SO_YOU_CAN_KEEP_TRACK"))

    //do a bunch of stuff here...
}
Run Code Online (Sandbox Code Playgroud)

聪明的魔法是在函数的开头调用trace(),但un()被推迟到结尾.由于日志声明,它不是原子钟准确的,但如果你需要更高的准确度,这种模式是Go的棉花糖优势之一.

编辑:

这个答案最初使用的是遗留时间包API.此处仅为历史价值而转载:

适用于每周12-01-2011之前的W/Go版本:

func trace(s string) (string, int64) {
    log.Println("START:", s)
    return s, time.Nanoseconds()
}

func un(s string, startTime int64) {
    endTime := time.Nanoseconds()
    log.Println("  END:", s, "ElapsedTime in seconds:", float32(endTime-startTime)/1E9)
}
Run Code Online (Sandbox Code Playgroud)


pet*_*rSO 30

使用Go testing包来对功能进行基准测试.例如,

package main

import (
    "fmt"
    "testing"
)

// the function to be benchmarked
func Function(n int) int64 {
    n64 := int64(n)
    return n64 * n64
}

func BenchmarkFunction(b *testing.B) {
    n := 42
    for i := 0; i < b.N; i++ {
        _ = Function(n)
    }
}

func main() {
    br := testing.Benchmark(BenchmarkFunction)
    fmt.Println(br)
}
Run Code Online (Sandbox Code Playgroud)

输出:

500000000            4.22 ns/op
Run Code Online (Sandbox Code Playgroud)

您还可以使用Go gotest命令运行基准测试.


小智 12

也许你也可以使用持续时间(已过去)...看起来更好一些.

func trace(s string) (string, time.Time) {
    log.Printf("trace start: %s\n", s)
    return s, time.Now()
}

func un(s string, startTime time.Time) {
    elapsed := time.Since(startTime)
    log.Printf("trace end: %s, elapsed %f secs\n", s, elapsed.Seconds())
}
Run Code Online (Sandbox Code Playgroud)


Sal*_*ali 10

另一个简单的方法是:

import (
    "fmt"
    "time"
)

start := time.Now()
// some computation
elapsed := time.Since(start)
fmt.Println(elapsed)
Run Code Online (Sandbox Code Playgroud)

这将输出类似的东西 359.684612ms