函数埋点
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() // 等待所有任务完成
}