実行時間を計算する最良の方法を探しています。
func main() {
start := time.Now()
time.Sleep(time.Second * 2)
//something doing here
elapsed := time.Since(start)
fmt.Printf("page took %s", elapsed)
}
上記のコードは正常に動作します。
しかし、テンプレートを使用する場合は、テンプレート関数ごとに再度作成する必要があります。
テンプレートを含む実行時間を計算する効率的な方法はありますか?
関数全体のタイミングを計っている場合は、defer
を使用して反復的なコードの一部を削除できます。
func elapsed(what string) func() {
start := time.Now()
return func() {
fmt.Printf("%s took %v\n", what, time.Since(start))
}
}
func main() {
defer elapsed("page")()
time.Sleep(time.Second * 2)
}
Cerise によって提供されるソリューションは完璧です。
さらに、関数名を明示的に渡したくない場合は、次のように実行できます。
func SomeFunction(list *[]string) {
defer TimeTrack(time.Now())
// Do whatever you want.
}
func TimeTrack(start time.Time) {
elapsed := time.Since(start)
// Skip this function, and fetch the PC and file for its parent.
pc, _, _, _ := runtime.Caller(1)
// Retrieve a function object this functions parent.
funcObj := runtime.FuncForPC(pc)
// Regex to extract just the function name (and not the module path).
runtimeFunc := regexp.MustCompile(`^.*\.(.*)$`)
name := runtimeFunc.ReplaceAllString(funcObj.Name(), "$1")
log.Println(fmt.Sprintf("%s took %s", name, elapsed))
}
その結果、次のようになります:
SomeFunction took 15.483µs
詳細については、この記事を参照してください: Go関数トレース
知識を共有します。 :)
延期関数を使用して、コンソールで実行時間を簡単に取得できます。
コードにエラーが発生した場合でも遅延関数は実行されるため、常に実行時間を取得できます。
時間パッケージは、時差を取得するために使用されます。
func main() {
now := time.Now()
defer func() {
fmt.Println(time.Now().Sub(now))
}()
// Here you can do whatever you want
}
または、このコードを使用できます
func main() {
now := time.Now()
defer func() {
fmt.Println(time.Since(now))
}()
// Here you can do whatever you want
}
詳細は Playground のコードを確認してください。パニックエラーの場合でも、実行時間を出力すると同時にエラーから回復する機能をいくつか追加しました。
Init関数を使用する
package main
import (
"fmt"
"time"
)
var start time.Time
func init() {
start = time.Now()
}
func getChars(s string) {
for _, c := range s {
fmt.Printf("%c at time %v\n", c, time.Since(start))
time.Sleep(10 * time.Millisecond)
}
}
func main() {
fmt.Println("main execution started at time", time.Since(start))
getChars("Hello")
fmt.Println("\nmain execution stopped at time", time.Since(start))
}