首頁 > 後端開發 > 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(),導致開始時間無法反映執行函數所需的實際時間。

要解決此問題,可以將程式碼修改如下:

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板