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