ホームページ >バックエンド開発 >Golang >Go で Defer を使用して実行時間を測定すると、常にゼロが得られるのはなぜですか?

Go で Defer を使用して実行時間を測定すると、常にゼロが得られるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-17 16:37:01416ブラウズ

Why Does Measuring Execution Time with Defer in Go Always Yield Zero?

Go での実行時間の測定: Defer の謎を解決する

Defer ステートメントは、関数の完了を待ってから、関連する関数を実行します。ただし、defer を使用して次の関数の実行時間を出力すると、常にゼロが返されます:

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

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

問題:
defer は、含まれる関数が遅延関数の引数を延期するときに、遅延関数の引数を評価します。 。したがって、start はループまたはスリープの前にすぐに評価されます。

解決策:
経過時間を正確に測定するには、遅延関数内で time.Now() を評価します。

defer func() { fmt.Println(time.Now().Sub(start)) }()

これにより、遅延関数の実行時に時差が計算され、正確な時刻が保証されます。

ヒント: より簡単かつ一貫した測定を行うために、再利用可能な関数を使用してタイミング ロジックをカプセル化することを検討してください。

以上がGo で Defer を使用して実行時間を測定すると、常にゼロが得られるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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