Heim > Backend-Entwicklung > Golang > Warum gibt die Messung der Funktionsausführungszeit mit „defer' in Go manchmal Null zurück?

Warum gibt die Messung der Funktionsausführungszeit mit „defer' in Go manchmal Null zurück?

Patricia Arquette
Freigeben: 2024-11-23 04:10:15
Original
856 Leute haben es durchsucht

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

So messen Sie die Funktionsausführungszeit in Go

Beim Verfolgen der Leistung einer Go-Funktion wird häufig die Defer-Anweisung zum Verzögern verwendet die Ausführung einer Funktion, bis die umgebende Funktion zurückkehrt. In bestimmten Fällen kann das Verzögern der Ausführung einer Funktion zum Drucken ihrer Ausführungszeit jedoch zu einer unerwarteten Nullwertausgabe führen.

Betrachten Sie den folgenden Code:

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)
}
Nach dem Login kopieren

In diesem Beispiel , versucht die Defer-Anweisung, die seit dem ersten Aufruf der Funktion verstrichene Zeit auszugeben. Da die Argumente der verzögerten Funktion jedoch zu dem Zeitpunkt ausgewertet werden, an dem die Funktion zurückgestellt wird, erfolgt der Aufruf von time.Now() sofort, wenn start zugewiesen wird, was zu einer Startzeit führt, die nicht die tatsächliche Ausführungszeit widerspiegelt Funktion.

Um dieses Problem zu beheben, kann der Code wie folgt geändert werden:

defer func() { fmt.Println(time.Now().Sub(start)) }()
Nach dem Login kopieren

Durch Einschließen des fmt.Println-Aufrufs in eine anonyme Funktion werden die Argumente zurückgestellt Funktion werden ausgewertet, wenn die Funktion ausgeführt wird, um sicherzustellen, dass die Startzeit korrekt erfasst wird.

Darüber hinaus kann die Verwendung einer wiederverwendbaren Funktion zur Kapselung der Timing-Logik den Code weiter vereinfachen:

func timeFunction(f func()) {
    start := time.Now()
    f()
    fmt.Println(time.Now().Sub(start))
}
Nach dem Login kopieren

Diese Funktion kann dann wie folgt verwendet werden:

timeFunction(func() {
    sum := 0
    for i := 1; i < 101; i++ {
        sum += i
    }
    time.Sleep(1 * time.Second)
    fmt.Println(sum)
})
Nach dem Login kopieren

Durch das Verständnis der Funktionsweise verzögerter Funktionen in Go können Entwickler die Ausführungszeit von Funktionen effektiv messen und optimieren Leistung.

Das obige ist der detaillierte Inhalt vonWarum gibt die Messung der Funktionsausführungszeit mit „defer' in Go manchmal Null zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage