首頁  >  文章  >  後端開發  >  為什麼在 Go 中使用 Defer 測量執行時間總是產生零?

為什麼在 Go 中使用 Defer 測量執行時間總是產生零?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-17 16:37:01352瀏覽

Why Does Measuring Execution Time with Defer in Go Always Yield Zero?

測量 Go 中的執行時間:解決 Defer 之謎

Defer 語句在執行關聯函數之前等待函數完成。但是,使用 defer 列印以下函數的執行時間始終為零:

func sum() {
    start := time.Now()

    // Expected 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)) }()

這樣做可以在延遲函數執行時計算時間差,保證準確結果。

提示:考慮使用可重複使用函數來封裝時序邏輯,以便更輕鬆、更一致的測量。

以上是為什麼在 Go 中使用 Defer 測量執行時間總是產生零?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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