Go での関数ランタイムのプロファイリング: 正確な遅延アプローチ
ソフトウェア最適化の領域では、関数の実行時間を測定することで、有益な洞察が得られます。効率の向上。堅牢なプログラミング言語である Go は、関数のタイミングを計り、そのランタイムをミリ秒単位で返すための便利なメカニズムを提供します。
時間測定関数
冒険を始めるために、始めましょう。プロファイリングしたい関数を作成します。この例は、指定された期間スリープするだけです:
func SleepFor(d time.Duration) { time.Sleep(d) }
Go の Defer の利点
Go の defer キーワードは、この取り組みに役立ちます。囲んでいる関数が終了するまで関数の実行を延期することで、関数呼び出しから実際の実行までの経過時間を測定できます。
時間測定コード
見てみましょうトレースとアンという適切な名前の 2 つのヘルパー関数を導入します。 Trace は関数のエントリ ポイントをログに記録し、開始時間をキャプチャします。一方、un は終了ポイントをログに記録し、経過時間を秒単位で計算します。 log.Println("START:", s) s、time.Now() を返す } func un(s string, startTime time.Time) { endTime := time.Now() log.Println(" END:", s, "経過時間 (秒):", endTime.Sub(startTime)) }
func trace(s string) (string, time.Time) { log.Println("START:", s) return s, time.Now() } func un(s string, startTime time.Time) { endTime := time.Now() log.Println(" END:", s, "ElapsedTime in seconds:", endTime.Sub(startTime)) }タイミングの実装
さて、これらのヘルパー関数を SleepFor 関数に組み込みましょう:
func profileSleep(d time.Duration) { defer un(trace("SleepFor")) スリープフォー(d) }
func trace(s string) (string, time.Time) { log.Println("START:", s) return s, time.Now() } func un(s string, startTime time.Time) { endTime := time.Now() log.Println(" END:", s, "ElapsedTime in seconds:", endTime.Sub(startTime)) }Squeaky Clean Results
この洗練された実装により、関数呼び出しごとに簡潔な経過時間ログを取得します:
START: profileSleep END: profileSleep ElapsedTime (秒): 0.50044
func trace(s string) (string, time.Time) { log.Println("START:", s) return s, time.Now() } func un(s string, startTime time.Time) { endTime := time.Now() log.Println(" END:", s, "ElapsedTime in seconds:", endTime.Sub(startTime)) }精度に関する考慮事項
ログは正確な経過時間を提供しますが、ログ ステートメント自体には若干の不正確さが生じることに注意してください。より高い精度が必要な場合は、代替のタイミング メカニズムを検討してください。
結論Go の遅延を利用すると、タイミング関数とその実行時間をミリ秒単位で取得することが簡単になります。この強力な手法により、コードのパフォーマンスに関する洞察が可能になり、アプリケーションの効率を向上させる最適化への道が開かれます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3