亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中使用 defer 語句測量經過的時間

在 Go 中使用 defer 語句測量經過的時間

Go
絕地無雙 2023-01-03 14:09:33
我想到了使用defer語句來測量 Go 中程序的運行時間:func main() {    start := time.Now()    defer fmt.Println(fmt.Sprintf("The process took %s", time.Now().Sub(start)))    ...}我認為這會產生正確的結果,但事實并非如此:[09:36:55]pc@work:~/test$ go run ./main.goProcessed 209806/209806 TUF filesAll records are inserted in the database.Verifying records are inserted correctly...Verified 209806/209806 TUF filesAll records have been inserted and verified successfully.The process took 600ns[14:24:06]pc@work:~/test$盡管該過程耗時 5 小時(從左側的時間戳可以看出),但延遲fmt.Println()語句顯示為 600 納秒。我究竟做錯了什么?
查看完整描述

2 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

延遲函數參數會立即求值。您可以將他們的評估包裝到一個匿名函數中以延遲他們的評估,直到延遲實際被觸發:

defer func() {
    fmt.Println(fmt.Sprintf("The process took %s", time.Now().Sub(start)))
}()

在Go 之旅語言規范中閱讀有關 defer 語句的更多信息。



查看完整回答
反對 回復 2023-01-03
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

defer立即評估紅色函數的參數,這意味著該time.Now().Sub(start)部分在開始后立即計算。

如果你想為函數計時,說:

defer func() {
    time.Now().Sub(start) // ...
    }()

或者,我已經為它寫了一個包:https ://github.com/gonutz/tic所以你可以說:

func main() { 
   defer tic.Toc()()
}

并注意()()出于完全相同的原因而存在的兩個函數,第一個函數調用啟動計時并返回一個要延遲的函數,該函數停止計時。


查看完整回答
反對 回復 2023-01-03
  • 2 回答
  • 0 關注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號