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