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