Heim >Backend-Entwicklung >Golang >Warum gibt die Messung der Funktionsausführungszeit mit „defer' in Go manchmal Null zurück?
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) }
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)) }()
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)) }
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) })
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!