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

Barbara Streisand
リリース: 2024-11-17 08:52:03
オリジナル
132 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート