首頁  >  文章  >  後端開發  >  如何使用 Go 的 defer 語句準確測量函數執行時間?

如何使用 Go 的 defer 語句準確測量函數執行時間?

Linda Hamilton
Linda Hamilton原創
2024-11-17 14:49:02688瀏覽

How Can We Accurately Measure Function Execution Time Using Go's `defer` Statement?

Defer Timing:在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn