web-dev-qa-db-ja.com

Goで関数の時間を計り、その実行時間をミリ秒でどのように返しますか?

Goで関数の時間を計り、その実行時間をミリ秒でどのように返しますか?

36
The Puma

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

出力:

500000000            4.22 ns/op

Go gotest コマンドを使用してベンチマークを実行することもできます。

30
peterSO

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

その後、Squeaky Cleanの1行の経過時間ログメッセージが表示されます。

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

    //do a bunch of stuff here...
}

賢い魔法は、trace()が関数の最初に呼び出されますが、un()が最後まで延期されることです。ログステートメントのため、アトミッククロックでは正確ではありませんが、より高い精度が必要な場合、この種のパターンはGoのマシュマロの優れた強みの1つです。

編集:

この回答は元々、レガシータイムパッケージAPIを使用していました。歴史的価値のためだけにここに再現:

毎週12-01-2011より前の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)
}
32
amattn

おそらく、このために継続時間(経過)を使用することもできます...少し見栄えが良くなります。

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

別の簡単な方法は次のとおりです。

import (
    "fmt"
    "time"
)

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

359.684612msのようなものを出力します

11
Salvador Dali

タイムパッケージには、タイムスタンプとタイマーのオプションがいくつかあります。こちらのドキュメントをご覧ください: http://golang.org/pkg/time/

1
TJD