ホームページ > バックエンド開発 > Golang > Go で `defer` を使用して関数の実行時間を測定すると、ゼロが返されることがあるのはなぜですか?

Go で `defer` を使用して関数の実行時間を測定すると、ゼロが返されることがあるのはなぜですか?

Patricia Arquette
リリース: 2024-11-23 04:10:15
オリジナル
842 人が閲覧しました

Why does measuring function execution time with `defer` in Go sometimes return zero?

Go で関数の実行時間を測定する方法

Go 関数のパフォーマンスを追跡するときは、defer ステートメントを使用して遅延するのが一般的です。周囲の関数が戻るまでの関数の実行。ただし、場合によっては、実行時間を出力するために関数の実行を延期すると、予期しないゼロ値の出力が発生する可能性があります。

次のコードを考えてみましょう。

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)
}
ログイン後にコピー

この例では、 、defer ステートメントは、関数が最初に呼び出されてからの経過時間を出力しようとしています。ただし、遅延関数の引数は関数が遅延された時点で評価されるため、start が割り当てられるとすぐに time.Now() 呼び出しが行われ、その結果、実際の実行にかかった時間が反映されない開始時刻になります。 function.

この問題に対処するには、コードを次のように変更できます。

defer func() { fmt.Println(time.Now().Sub(start)) }()
ログイン後にコピー

fmt.Println 呼び出しを匿名関数でラップすることで、引数

さらに、再利用可能な関数を使用してタイミング ロジックをカプセル化すると、コードをさらに簡素化できます。

func timeFunction(f func()) {
    start := time.Now()
    f()
    fmt.Println(time.Now().Sub(start))
}
ログイン後にコピー

この関数は次のように使用できます。

timeFunction(func() {
    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
})
ログイン後にコピー

Go で遅延関数がどのように動作するかを理解することで、開発者は関数の実行時間を効果的に測定し、パフォーマンスを最適化できます。

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

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