今天想計(jì)算程序的耗時(shí)時(shí)間,為了方便使用defer來計(jì)算函數(shù)的總的執(zhí)行時(shí)間。但是很少。后來經(jīng)過如下實(shí)驗(yàn)發(fā)下了問題:
logsParam := "[test]"
startTime := time.Now()
defer logs.Warning("%s end-cost Seconds:%vs ", logsParam, time.Since(startTime).Seconds())
time.Sleep(2 * time.Second)
logs.Warning("%s end-cost-2 Seconds:%vs ", logsParam, time.Since(startTime).Seconds())
輸出:
2020/08/21 14:55:45.888 [W] [proc.go:203] [test] end-cost-2 Seconds:2.000612215s
2020/08/21 14:55:45.888 [W] [proc.go:203] [test] end-cost Seconds:1.45e-07s
使用以上的defer形式來計(jì)算耗時(shí)確實(shí)有問題。
后來找到原因了:defer 調(diào)用的函數(shù)參數(shù)的值 defer 被定義時(shí)就確定了。所以耗時(shí)參數(shù)在defer定義的那塊就確定了,所以耗時(shí)就很少了。
計(jì)算耗時(shí)的方法可以改成這樣:
logsParam := "[test]"
startTime := time.Now()
defer func(time1 time.Time) {
logs.Warning("%s end-cost Seconds:%v\n", logsParam, time.Since(time1))
}(startTime)
time.Sleep(2 * time.Second)
logs.Warning("%s end-cost-2 Seconds:%vs ", logsParam, time.Since(startTime).Seconds())
輸出:
2020/08/21 15:27:31.594 [W] [proc.go:203] [test] end-cost-2 Seconds:2.000604603s
2020/08/21 15:27:31.594 [W] [main.go:58] [test] end-cost Seconds:2.000729234s
圓滿完成~~~