首页
学习
活动
专区
工具
TVP
发布

golang日志组件使用runtime.Caller性能问题分析

背景 runtime.Caller能够拿到当前执行的文件名和行号,这个方法几乎所有的日志组件里都有使用。...(1) return line } 在同一需求场景下,FILE和LINE分别调用了一次能耗较高的runtime.Caller,这个其实一次就行。...另外一方面,在调用性能比较差的runtime.Caller之前,把锁释放,执行完毕后再把锁加上,继续处理自己后续的业务。这个可以避免锁的时间过长,影响其他业务。...而这里提升性能的一种解决方案是使用资源池entryPool sync.Pool,当然这里的资源池不是说runtime.Caller之类的可以复用,而是空的entry实例。...如果logger实例使用了mutex锁,那么在调用runtime.Caller或者runtimr.Frame之前先将锁释放,调用完毕后再锁上。

9.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

如何在 Go 函数中获取调用者的函数名、文件名、行号...

本文主要介绍 runtime.Caller 的使用,上面说了那么多只是为了铺垫一下,学会它,在哪些地方可以应用上。...runtime.Caller runtime.Caller 的函数签名如下: func Caller(skip int) (pc uintptr, file string, line int, ok bool...是不是有点晕,这里举个例子 func CallerA() { //获取的是 CallerA 这个函数的调用栈 pc, file, lineNo, ok := runtime.Caller(0)...//获取的是 CallerA函数的调用者的调用栈 pc1, file1, lineNo1, ok1 := runtime.Caller(1) } 函数的返回值为调用栈标识符、带路径的完整文件名...总结 今天介绍了通过 runtime.Caller 回溯调用栈获取调用者的信息的方法,虽然强大,不过频繁获取这个信息也是会对程序性能有影响。

6K20

Golang 语言的标准库 log 包怎么使用?

l.mu.Unlock() var ok bool _, file, line, ok = runtime.Caller(calldepth) if !...err := l.out.Write(l.buf) return err } 通过阅读 Output() 函数的源码,可以发现使用互斥锁来保证多个 goroutine 写日志的安全,并且在调用 runtime.Caller...函数 Output() 的源码也比较简单,其中最值得注意的是 runtime.Caller() 函数,源码如下: func Caller(skip int) (pc uintptr, file string...= 0 } 通过阅读 runtime.Caller() 函数的源码,可以发现它接收一个 int 类型的参数 skip,该参数表示跳过栈帧数,log 包中的输出功能的函数,使用的默认值都是 2,原因是什么...举例说明,比如在 main 函数中调用 log.Print,方法调用栈为 main->log.Print->*Logger.Output->runtime.Caller,所以此时参数 skip 的值为

47420

三种获取Go项目根目录的方式,让你做架构,选哪种?

在网上搜索怎么获取 Go 项目的根目录,一般有三种,分别依赖 Go 的以下三个底层函数实现: os.Getwd() os.Args[0] runtime.Caller 虽然这三种方式都能获取到Go项目的根目录...runtime.Caller 想获取到程序的根目录,如果能拿到当前正在执行的代码的文件路径,我们也就能推断出程序的根目录了。怎么能拿到当前正在执行的代码的文件路径呢?...当时看了源码后我们发现用的是 runtime.Caller() func Caller(skip int) (pc uintptr, file string, line int, ok bool) 所以我们在...config.go中,能这样获取当前文件的路径: // 获取当前文件的路径 _, filename, _, _ := runtime.Caller(0) runtime.Caller 这里不在详细介绍

2.4K10

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券