如何测量 Go 中函数的执行时间
在跟踪 Go 函数的性能时,通常使用 defer 语句来延迟执行一个函数直到周围的函数返回。但是,在某些情况下,推迟函数的执行以打印其执行时间可能会导致意外的零值输出。
请考虑以下代码:
func sum() { start := time.Now() //expecting to print non zero value but always gets 0 defer fmt.Println(time.Now().Sub(start)) sum := 0 for i := 1; i < 101; i++ { sum += i } time.Sleep(1 * time.Second) fmt.Println(sum) }
在此示例中,defer 语句尝试打印自最初调用该函数以来经过的时间。但是,由于延迟函数的参数是在函数延迟时计算的,因此在分配 start 时会立即调用 time.Now(),从而导致开始时间无法反映执行该函数所需的实际时间。
要解决此问题,可以将代码修改如下:
defer func() { fmt.Println(time.Now().Sub(start)) }()
通过将 fmt.Println 调用包装在匿名函数中,参数延迟函数在函数执行时进行评估,确保正确捕获开始时间。
此外,使用可重用的函数来封装时序逻辑可以进一步简化代码:
func timeFunction(f func()) { start := time.Now() f() fmt.Println(time.Now().Sub(start)) }
这个函数可以如下使用:
timeFunction(func() { sum := 0 for i := 1; i < 101; i++ { sum += i } time.Sleep(1 * time.Second) fmt.Println(sum) })
通过理解 Go 中延迟函数的工作原理,开发者可以有效地测量执行时间功能并优化其性能。
以上是为什么 Go 中使用 defer 测量函数执行时间有时会返回零?的详细内容。更多信息请关注PHP中文网其他相关文章!