首页 > 后端开发 > Golang > 为什么 Go 中使用 defer 测量函数执行时间有时会返回零?

为什么 Go 中使用 defer 测量函数执行时间有时会返回零?

Patricia Arquette
发布: 2024-11-23 04:10:15
原创
844 人浏览过

Why does measuring function execution time with `defer` in Go sometimes return zero?

如何测量 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板