Go에서 Defer를 사용하여 실행 시간을 측정하면 항상 0이 나오는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-17 16:37:01
원래의
348명이 탐색했습니다.

Why Does Measuring Execution Time with Defer in Go Always Yield Zero?

Go에서 실행 시간 측정: 지연 문제 해결

Defer 문은 관련 함수를 실행하기 전에 함수 완료를 기다립니다. 그러나 defer를 사용하여 다음 함수의 실행 시간을 인쇄하면 항상 0이 생성됩니다.

func sum() {
    start := time.Now()

    // Expected 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)) }()
로그인 후 복사

이렇게 하면 지연된 함수가 실행될 때 시간 차이가 계산되어 정확한 결과가 보장됩니다.

팁: 재사용 가능한 함수를 사용하여 타이밍 로직을 캡슐화하는 것을 고려해 보세요. 더욱 쉽고 일관된 측정이 가능합니다.

위 내용은 Go에서 Defer를 사용하여 실행 시간을 측정하면 항상 0이 나오는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿