Golang_计算调用函数耗费时间

168 阅读2分钟

📌 文章粗浅,敬请批评指正🤞

前言

有时候我们想要获得调用函数所消耗时间,那么我们应该怎么获取呢?

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)
}

思路

在函数开始后立即获取起始时候,再获取函数即将结束前的结束时间,最后取出它们的差值,就是这个计算所消耗的时间。

  1. 在函数第一行调用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语句漏写输出语句

  1. 使用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()执行结束就已经进行 ❕ 解决方法:把输出语句用匿名函数封装起来

  1. 用匿名函数封装输出语句
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关键字修饰匿名函数解决了获得调用接口耗时需求

 

欢迎大家的交流!🤞