From 5e3337a52e8aaf47737245f2a584760c41a5d92a Mon Sep 17 00:00:00 2001 From: dudaodong Date: Fri, 6 Sep 2024 15:51:56 +0800 Subject: [PATCH] feat: add TrackFuncTime in datetime package --- datetime/datetime.go | 29 +++++++++++++++++++++---- datetime/datetime_example_test.go | 14 +++++++++++++ datetime/datetime_test.go | 9 ++++++++ docs/api/packages/datetime.md | 35 ++++++++++++++++++++++++++++++- docs/en/api/packages/datetime.md | 33 +++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+), 5 deletions(-) diff --git a/datetime/datetime.go b/datetime/datetime.go index 5432deb..ea2e59c 100644 --- a/datetime/datetime.go +++ b/datetime/datetime.go @@ -30,6 +30,7 @@ package datetime import ( "fmt" + "runtime" "strings" "time" ) @@ -382,11 +383,31 @@ func TimestampNano(timezone ...string) int64 { return t.UnixNano() } -// TraceFuncTime: trace the func costed time,just call it at top of the func like `defer TraceFuncTime()()` -func TraceFuncTime() func() { - pre := time.Now() +// TrackFuncTime track the time of function execution. +// call it at top of the func like `defer TrackFuncTime(time.Now())()` +// Play: todo +func TrackFuncTime(pre time.Time) func() { + callerName := getCallerName() return func() { elapsed := time.Since(pre) - fmt.Println("Costs Time:\t", elapsed) + fmt.Printf("Function %s execution time:\t %v", callerName, elapsed) } } + +func getCallerName() string { + pc, _, _, ok := runtime.Caller(2) + if !ok { + return "Unknown" + } + fn := runtime.FuncForPC(pc) + if fn == nil { + return "Unknown" + } + + fullName := fn.Name() + if lastDot := strings.LastIndex(fullName, "."); lastDot != -1 { + return fullName[lastDot+1:] + } + + return fullName +} diff --git a/datetime/datetime_example_test.go b/datetime/datetime_example_test.go index 0522304..4973b69 100644 --- a/datetime/datetime_example_test.go +++ b/datetime/datetime_example_test.go @@ -408,3 +408,17 @@ func ExampleIsWeekend() { // true // false } + +// func ExampleTrackFuncTime() { +// defer TrackFuncTime(time.Now())() + +// var n int +// for i := 0; i < 5000000; i++ { +// n++ +// } + +// fmt.Println(1) + +// // Output: +// // 1 +// } diff --git a/datetime/datetime_test.go b/datetime/datetime_test.go index 6066dd0..1e3202e 100644 --- a/datetime/datetime_test.go +++ b/datetime/datetime_test.go @@ -410,3 +410,12 @@ func TestTimestamp(t *testing.T) { ts4 := TimestampNano() t.Log(ts4) } + +func TestTrackFuncTime(t *testing.T) { + defer TrackFuncTime(time.Now())() + + var n int + for i := 0; i < 5000000; i++ { + n++ + } +} diff --git a/docs/api/packages/datetime.md b/docs/api/packages/datetime.md index 8b10524..8b56061 100644 --- a/docs/api/packages/datetime.md +++ b/docs/api/packages/datetime.md @@ -64,6 +64,7 @@ import ( - [TimestampMilli](#TimestampMilli) - [TimestampMicro](#TimestampMicro) - [TimestampNano](#TimestampNano) +- [TrackFuncTime](#TrackFuncTime)
@@ -1334,7 +1335,7 @@ import ( func main() { result1 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss") - result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST") + result2 := datetime.NowDateOrTime("yyyy-mm-dd hh:mm:ss", "EST") fmt.Println(result1) fmt.Println(result2) @@ -1464,4 +1465,36 @@ func main() { // Output: // 1690363051331788000 } +``` + +### TrackFuncTime + +

测试函数执行时间。

+ +函数签名: + +```go +func TrackFuncTime(pre time.Time) func() +``` + +示例:[运行]() + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/datetime" +) + +func main() { + defer datetime.TrackFuncTime(time.Now())() + + var n int + for i := 0; i < 5000000; i++ { + n++ + } + + fmt.Println(1) // Function main execution time: 1.460287ms +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/datetime.md b/docs/en/api/packages/datetime.md index 6fc31ef..7f88534 100644 --- a/docs/en/api/packages/datetime.md +++ b/docs/en/api/packages/datetime.md @@ -65,6 +65,7 @@ import ( - [TimestampMilli](#TimestampMilli) - [TimestampMicro](#TimestampMicro) - [TimestampNano](#TimestampNano) +- [TrackFuncTime](#TrackFuncTime)
@@ -1465,3 +1466,35 @@ func main() { // 1690363051331788000 } ``` + +### TrackFuncTime + +

Tracks function execution time.

+ +Signature: + +```go +func TrackFuncTime(pre time.Time) func() +``` + +Example:[Run]() + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/datetime" +) + +func main() { + defer datetime.TrackFuncTime(time.Now())() + + var n int + for i := 0; i < 5000000; i++ { + n++ + } + + fmt.Println(1) // Function main execution time: 1.460287ms +} +```