Funktionsausführungszeit mit verzögerten Funktionen in Go messen
In Go bieten verzögerte Funktionen einen praktischen Mechanismus, um die Ausführung einer Funktion bis zu verzögern Die umgebende Funktion kehrt zurück. Das Drucken der für die Ausführung einer verzögerten Funktion benötigten Zeit führt jedoch manchmal zu unerwarteten Ergebnissen.
Problem:
Betrachten Sie die folgende sum()-Funktion, die versucht, die Ausführungszeit zu berechnen Verwenden einer verzögerten Funktion:
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) }
Das Ausführen dieses Codes führt zur Ausgabe von 0 für die Ausführungszeit.
Lösung:
Das Problem tritt auf, weil Die Argumente der verzögerten Funktion werden ausgewertet, wenn die Funktion zurückgestellt wird, nicht wenn sie ausgeführt wird. Um dies zu beheben, verwenden Sie eine anonyme Funktion, um den aktuellen Wert von „start“ zu erfassen und die Ausführung dieser anonymen Funktion zu verzögern:
defer func() { fmt.Println(time.Now().Sub(start)) }()
Durch die Verwendung einer anonymen Funktion wird der Wert von „start“ zum Zeitpunkt der Verzögerung ausgewertet Funktion wird ausgeführt.
Weitere Überlegungen:
Wenn Sie mehr Anpassung oder Flexibilität benötigen, sollten Sie die Kapselung der Timing-Logik in einer wiederverwendbaren Funktion in Betracht ziehen. Dieser Ansatz bietet eine modularere und wiederverwendbarere Lösung.
Das obige ist der detaillierte Inhalt vonWarum liefert die Messung der Ausführungszeit verzögerter Funktionen in Go unerwartete Ergebnisse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!