web-dev-qa-db-ja.com

golangで実行時間を計算する効率的な方法はありますか?

実行時間を計算する最良の方法を探しています。

func main() {
    start := time.Now()

    time.Sleep(time.Second * 2)

    //something doing here

    elapsed := time.Since(start)
    fmt.Printf("page took %s", elapsed)
}

上記のコードは正常に動作します。

しかし、テンプレートを使用する場合は、テンプレート関数ごとに再度作成する必要があります。

テンプレートを含む実行時間を計算する効率的な方法はありますか?

22

関数全体のタイミングを計っている場合は、deferを使用して反復的なコードの一部を削除できます。

func elapsed(what string) func() {
    start := time.Now()
    return func() {
        fmt.Printf("%s took %v\n", what, time.Since(start))
    }
}

func main() {
    defer elapsed("page")()
    time.Sleep(time.Second * 2)
}

遊び場の例

23
ThunderCat

Cerise によって提供されるソリューションは完璧です。


さらに、関数名を明示的に渡したくない場合は、次のように実行できます。

func SomeFunction(list *[]string) {
    defer TimeTrack(time.Now())
    // Do whatever you want.
}

func TimeTrack(start time.Time) {
    elapsed := time.Since(start)

    // Skip this function, and fetch the PC and file for its parent.
    pc, _, _, _ := runtime.Caller(1)

    // Retrieve a function object this functions parent.
    funcObj := runtime.FuncForPC(pc)

    // Regex to extract just the function name (and not the module path).
    runtimeFunc := regexp.MustCompile(`^.*\.(.*)$`)
    name := runtimeFunc.ReplaceAllString(funcObj.Name(), "$1")

    log.Println(fmt.Sprintf("%s took %s", name, elapsed))
}

その結果、次のようになります:

SomeFunction took 15.483µs


詳細については、この記事を参照してください: Go関数トレース

知識を共有します。 :)

5
Mohsin

Golangで実行時間を計算する効率的な方法

延期関数を使用して、コンソールで実行時間を簡単に取得できます。

コードにエラーが発生した場合でも遅延関数は実行されるため、常に実行時間を取得できます。

時間パッケージは、時差を取得するために使用されます。

func main() {
    now := time.Now()
    defer func() {
        fmt.Println(time.Now().Sub(now))
    }()

    // Here you can do whatever you want
}

または、このコードを使用できます

func main() {
        now := time.Now()
        defer func() {
            fmt.Println(time.Since(now))
        }()

        // Here you can do whatever you want
    }

詳細は Playground のコードを確認してください。パニックエラーの場合でも、実行時間を出力すると同時にエラーから回復する機能をいくつか追加しました。

2
ASHWIN RAJEEV

Init関数を使用する

package main

import (
    "fmt"
    "time"
)

var start time.Time

func init() {
    start = time.Now()
}

func getChars(s string) {
    for _, c := range s {
        fmt.Printf("%c at time %v\n", c, time.Since(start))
        time.Sleep(10 * time.Millisecond)
    }
}

func main() {
    fmt.Println("main execution started at time", time.Since(start))

    getChars("Hello")

    fmt.Println("\nmain execution stopped at time", time.Since(start))
}
1
Uday Hiwarale