2 回答
TA贡献1806条经验 获得超5个赞
您可以使用 pprof组合:
概要分析,它可以帮助您了解谁调用了什么,调用了多长时间
(ofabry/go-callvis
也可以帮助查看调用图)
它的 Weblist 视图显示了每条已执行的行及其成本:
请参阅本指南中的“交互式分析” 。
这不会显示按顺序执行的每一行,但允许您在运行后探索执行的内容。
请注意,Go 1.20/1.21(2022 年第 4 季度/2023 年第 2 季度)将包括(因为接受了#55022):
Go 的配置文件引导优化 (PGO)
Go 程序中的低效率可以通过分析工具(例如
pprof
linux profiler )来隔离perf
。此类工具可以查明花费大部分执行时间的源代码区域。与其他优化编译器(如 LLVM)不同,Go 编译器尚未执行Profile-Guided Optimization(PGO)。
PGO 使用有关代码运行时行为的信息来指导编译器优化,例如内联、代码布局等。PGO 可以将应用程序性能提高 15-30% [LLVM、AutoFDO]。在这个提案中,我们用 PGO 扩展了 Go 编译器。
具体来说,我们将配置文件合并到编译器的前端,以构建具有节点和边权重(称为
WeightedCallGraph
)的调用图。Inliner 随后使用WeightedCallGraph
来执行配置文件引导的内联,该内联积极地内联热函数。我们引入了一个配置文件引导的代码专业化通道,它与 Inliner 紧密集成,并消除了热代码路径中的间接方法调用开销。
此外,我们使用相关的配置文件权重注释 IR 指令,并将这些指令传播到 SSA 级别,以促进配置文件引导的基本块布局优化,从而从更好的指令缓存和 TLB 性能中获益。
最后,我们扩展了 Go 的链接器以直接使用配置文件并跨包边界执行函数重新排序优化——这也有助于指令缓存和 TLB 性能。
pprof
我们的 PGO 使用的配置文件格式与该工具生成的 protobuf 格式相同。这种格式足够丰富,可以携带额外的硬件性能计数器信息,例如缓存未命中、LBR 等。Google
现有perf_data_converter
的工具可以将perf.data
Linuxperf
生成的profile.proto
文件转换为 protobuf 格式的文件。
Go 中将针对 PGO 提出一个新的编译流程
TA贡献1845条经验 获得超8个赞
由于 Go 是一种编译语言,可执行文件不包含任何原始源代码,因此无法输出。您最接近您想要的方法是在调试模式下运行您的 Go 项目并单步执行每一行代码。
这样你就可以在运行时决定跳转到一个函数或者只是执行它并跳过它,因为调试器不会知道你认为什么是“标准库”,什么应该逐行跟踪,什么不是。
另一方面,Go 可以是带有 go 例程的大量多线程,因此打印每条执行的行可能会在一分钟内变得一团糟(有时我有超过 100 个例程同时运行)。
- 2 回答
- 0 关注
- 101 浏览
添加回答
举报