我喜欢不允许代码重复。但是我有一种情况,当我必须在每个函数中重复它时,我想测量执行时间,而我对此无能为力。例如,一个函数:
func someFunc() {
start_time := time.Now()
defer fmt.Println("Execution time: %v", time.Now().Sub(start_time))
<... doing some bussiness ...>
}
现在我必须在每个函数中重复这两个前笔画(在原始函数中,由于调用函数名称,它们更复杂(。所以我不能做一个测量时间的函数,因为我必须在里面使用 defer。即使是第二笔画,我也无法制作函数,因为原始情况下它在 Println 中调用函数名称,这就是为什么结果名称不是必需的功能。有没有办法通过某些标签或模板插入此代码,例如:
func someFunc() {
//go-insert measuretime.tmpl
<... doing some bussiness ...>
}
而measuretime.tmpl是:
start_time := time.Now()
defer fmt.Println("Execution time: %v", time.Now().Sub(start_time))
这个技巧可能会有所帮助:推迟对返回包含开始时间的函数的函数的调用。
func elapsed() func() {
start := time.Now()
return func() {
fmt.Println("Duration was", time.Since(start))
}
}
按如下方式调用它:
defer elapsed()()
玩一玩
话虽如此,基准测试是衡量 Go 性能的常用方法。了解如何在 Go 中编写基准测试。