ホームページ  >  記事  >  バックエンド開発  >  Go で関数の実行時間を測定しようとすると、時間差の計算を延期すると 0 が返されるのはなぜですか?

Go で関数の実行時間を測定しようとすると、時間差の計算を延期すると 0 が返されるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-17 08:52:03137ブラウズ

Why does deferring a time difference calculation in Go return 0 when attempting to measure function execution time?

Go での関数の実行にかかる時間の測定

Go では、defer ステートメントを使用して、周囲の関数が戻るまで関数の実行を延期できます。ただし、defer を使用して関数の実行時間を出力しようとすると、0 が返されることがあります。この動作とその解決策を調べてみましょう。

問題

次のコード スニペットを考えてみましょう:

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

    //expecting to print non zero value but always gets 0
    defer fmt.Println(time.Now().Sub(start))

    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
}

少しスリープした後でも、時差計算を延期すると常に 0 が出力されます。これはなぜですか?

解決策

この問題は、遅延関数の引数が関数が遅延された時点で評価されるために発生します。遅延関数が実行されるまでに、周囲の関数はすでに返されており、start 変数はスコープ外になります。

これを修正するには、start の現在値をキャプチャするクロージャーを作成します。修正されたコードは次のとおりです。

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

    // Create a closure that captures the current value of start
    defer func() { fmt.Println(time.Now().Sub(start)) }()

    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
}

タイミング ロジックを別の関数にカプセル化すると、コードの再利用性も向上します。

以上がGo で関数の実行時間を測定しようとすると、時間差の計算を延期すると 0 が返されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。