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

Time 如何在Go中计时函数并以毫秒为单位返回其运行时?,time,timer,benchmarking,go,Time,Timer,Benchmarking,Go,如何在Go中计时函数并以毫秒为单位返回其运行时?时间包中有几个时间戳和计时器选项。请参阅此处的文档:使用Go包对函数进行基准测试。比如说, package main import ( "fmt" "testing" ) // the function to be benchmarked func Function(n int) int64 { n64 := int64(n) return n64 * n64 } func BenchmarkFunction(

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

时间包中有几个时间戳和计时器选项。请参阅此处的文档:

使用Go包对函数进行基准测试。比如说,

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

您还可以使用Go命令来运行基准测试。

Go的
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))
}
在此之后,您会得到一行非常干净的已用时间日志消息:

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

    //do a bunch of stuff here...
}
聪明的魔法是在函数的开头调用trace(),而un()则延迟到函数的结尾。由于日志语句,它不是原子钟精确的,但是如果你需要更精确的话,这种模式是Go的一个很好的优势

编辑:

这个答案最初使用遗留的时间包API。此处复制仅供历史参考:

对于2011年1月12日之前的版本,每周使用:

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

也许你也可以使用一个持续时间(经过的时间)来完成这个…看起来好一点

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

另一个简单的方法是:

import (
    "fmt"
    "time"
)

start := time.Now()
// some computation
elapsed := time.Since(start)
fmt.Println(elapsed)

它将输出类似于
359.684612ms

的内容,我已经看过该文档,但没有使用该文档的示例。我是不是先去定时器:=timer.Time(),然后去定时器.Stop()?这似乎不起作用。我该如何以毫秒为单位获取时间呢?诺亚·赫尔德曼建议编辑的帽子提示。不确定其被拒绝的原因,但将很快进行编辑。这不会像问题中所要求的那样“以毫秒为单位返回其运行时”。
import (
    "fmt"
    "time"
)

start := time.Now()
// some computation
elapsed := time.Since(start)
fmt.Println(elapsed)