Defer Timing:在 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) }
在此函数中,我们打算打印执行内循环所花费的时间。然而,我们的期望没有得到满足,输出始终显示 0。
这种差异的原因在于延迟函数的参数评估。参数在函数延迟时计算,而不是在实际执行时计算。当延迟函数运行时(当周围的函数返回时),循环已经完成,导致经过时间为 0。
要解决此问题并获得非零经过时间,我们可以修改代码如下:
defer func() { fmt.Println(time.Now().Sub(start)) }()
通过将延迟函数调用包装在另一个匿名函数中,我们延迟了计算开始时间的代码的执行。这确保了它在延迟函数调用执行之前被评估和更新。
这种方法使我们能够准确测量内部循环的执行时间:
start time: 2023-02-07 16:25:42.39378981 +0000 UTC end time: 2023-02-07 16:25:42.40889486 +0000 UTC time taken: 15.11010505ns
以上是如何使用 Go 的 defer 语句准确测量函数执行时间?的详细内容。更多信息请关注PHP中文网其他相关文章!