遅延タイミング: 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) }
この関数では、次のように出力します。内部ループの実行にかかる時間。ただし、期待は満たされず、出力は常に 0 を示します。
この不一致の理由は、遅延関数の引数の評価にあります。引数は、関数が実際に実行されるときではなく、関数が遅延されるときに評価されます。遅延関数が実行される時点 (周囲の関数が戻るとき) までに、ループはすでに完了しており、経過時間は 0 になります。
この問題を解決してゼロ以外の経過時間を取得するには、次のようにします。コードを次のように変更します。
defer func() { fmt.Println(time.Now().Sub(start)) }()
遅延関数呼び出しを追加の匿名関数でラップすることで、開始時間を評価するコードの実行を遅延します。これにより、遅延関数呼び出しが実行される直前に評価および更新されることが保証されます。
このアプローチにより、内部ループの実行時間を正確に測定できます。
start time: 2023-02-07 16:25:42.39378981 +0000 UTC end time: 2023-02-07 16:25:42.40889486 +0000 UTC time taken: 15.11010505ns
以上がGo の `defer` ステートメントを使用して関数の実行時間を正確に測定するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。