函数埋点
268字小于1分钟
2025-02-04
一行代码测量函数的执行时间
- 反射获取函数名
- 运行时间计算
- 并发执行
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
// getFunctionName 函数用于获取当前函数的名称
func getFunctionName() string {
pc, _, _, _ := runtime.Caller(1) // 使用 runtime 包的 Caller 方法获取调用栈信息
fn := runtime.FuncForPC(pc) // 使用反射包的 FuncForPC 方法获取函数的反射对象
return fn.Name() // 使用反射对象的 Name 方法获取函数名称
}
// TrackTime 函数用于跟踪函数执行时间
func TrackTime(start time.Time, functionName string) {
elapsed := time.Since(start)
fmt.Printf("Function %s elapsed time: %s\n", functionName, elapsed)
}
// work1 函数模拟耗时1秒的任务
func work1() {
defer TrackTime(time.Now(), getFunctionName()) // 传递开始时间和函数名称给 TrackTime
time.Sleep(1 * time.Second)
}
// work2 函数模拟耗时2秒的任务
func work2() {
defer TrackTime(time.Now(), getFunctionName())
time.Sleep(2 * time.Second)
}
func main() {
var wg sync.WaitGroup
wg.Add(2) // 添加两个待完成的任务
// 并发执行两个任务
go func() {
defer wg.Done()
work1()
}()
go func() {
defer wg.Done()
work2()
}()
wg.Wait() // 等待所有任务完成
}