我正在寻找计算执行时间的最佳方法。
func main() {
start := time.Now()
time.Sleep(time.Second * 2)
//something doing here
elapsed := time.Since(start)
fmt.Printf("page took %s", elapsed)
}
上面的代码工作正常。
但是当我使用模板时,我必须为每个模板函数再次编写它。
有没有一种有效的方法来计算执行时间,包括模板?
答案 0 :(得分:26)
如果您正在为整个函数计时,那么您可以使用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)
}
答案 1 :(得分:6)
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 Function Tracing
分享知识。 :)
答案 2 :(得分:2)
您可以使用延迟功能在控制台上轻松获取执行时间
即使代码出错,延迟函数也会执行,因此您始终可以获得执行时间。
时间包用于获取时差。
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/mainLinearLayout"
android:layout_width="match_parent"
android:layout_height="275sp"
tools:ignore="MissingConstraints"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="3dp">
<ImageView
android:id="@+id/imgschool"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/im"
android:contentDescription="@string/todo" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="115sp"
app:layout_constraintTop_toBottomOf="@+id/mainLinearLayout"
tools:ignore="MissingConstraints"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="278dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/download" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="110sp"
app:layout_constraintTop_toBottomOf="@+id/linearLayout"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="393dp"
tools:ignore="MissingConstraints">
<Button
android:id="@+id/btnlogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/btnregister"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:text="@string/login"
android:textStyle="bold"
tools:ignore="MissingConstraints"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="291dp" />
<Button
android:id="@+id/btnregister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:text="@string/sign_up"
android:textStyle="bold"
tools:ignore="MissingConstraints"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="340dp" />
</RelativeLayout>
</android.support.constraint.ConstraintLayout>
或者您可以使用此代码
func main() {
now := time.Now()
defer func() {
fmt.Println(time.Now().Sub(now))
}()
// Here you can do whatever you want
}
查看Playground中的代码以获取更多信息。我添加了一些功能来恢复错误,同时打印执行时间,即使出现紧急错误也是如此。
答案 3 :(得分:1)
使用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))
}