📌 文章粗浅,敬请批评指正🤞
前言
有时候我们想要获得调用函数所消耗时间,那么我们应该怎么获取呢?
package main
import "time"
func handler(a, b int) string {
if a > b {
time.Sleep(100 * time.Millisecond)
return "ok"
} else {
time.Sleep(200 * time.Millisecond)
return "ok"
}
}
func main() {
handler(3, 4)
}
思路
在函数开始后立即获取起始时候,再获取函数即将结束前的结束时间,最后取出它们的差值,就是这个计算所消耗的时间。
- 在函数第一行调用
time.Now()获得当前时间,在每一个return语句前输出time.Since(t).Milliseconds()
func handler(a, b int) string {
t := time.Now() // 新
if a > b {
time.Sleep(100 * time.Millisecond)
fmt.Printf("耗时:%d ms\n", time.Since(t).Milliseconds()) // 新
return "OK"
}else {
time.Sleep(200 * time.Millisecond)
fmt.Printf("耗时:%d ms\n", time.Since(t).Milliseconds()) // 新
return "OK"
}
}
❕ 但是,在每一行return前都写一个输出语句,代码会冗余,甚至有些return语句漏写输出语句
- 使用
defer关键字修饰输出语句,在函数返回之前执行
func handler(a, b int) string {
t := time.Now()
defer fmt.Printf("耗时:%d ms\n", time.Since(t).Milliseconds()) // 新
if a > b {
time.Sleep(100 * time.Millisecond)
return "OK"
} else {
time.Sleep(200 * time.Millisecond)
return "OK"
}
}
运行结果
耗时:0 ms
进程 已完成,退出代码为 0
❕ 显然,这个运行结果不符合预期。
❕ 原因:defer在函数返回之前执行,但是输出语句内的计算在time.Now()执行结束就已经进行
❕ 解决方法:把输出语句用匿名函数封装起来
- 用匿名函数封装输出语句
func handler(a, b int) string {
t := time.Now()
defer func() {
fmt.Printf("耗时:%d ms\n", time.Since(t).Milliseconds())
}() // 新
if a > b {
time.Sleep(100 * time.Millisecond)
return "OK"
} else {
time.Sleep(200 * time.Millisecond)
return "OK"
}
}
func main() {
handler(3, 4)
}
运行结果
耗时:206 ms
进程 已完成,退出代码为 0
❕ 使用defer关键字修饰匿名函数解决了获得调用接口耗时需求
欢迎大家的交流!🤞