golang是否有类似shell特性set -x的东西?我想看到每一行代码得到执行。不应打印标准库的行。
set -x
sgtfey8w1#
您可以合并using pprof:
(ofabry/go-callvis也有助于查看调用图)
ofabry/go-callvis
请参见this guide中的“交互式配置”。这不会按顺序显示执行的每一行,但允许您在运行后浏览执行的内容。请注意,Go 1.20/1.21(2022年第4季度/2023年第2季度)将包括(因为接受了#55022):第1001章:Go语言程序中的低效可以通过pprof和linux profiler perf这样的分析工具来隔离,这些工具可以精确地找出源代码中花费了大部分执行时间的区域。与LLVM等其他优化编译器不同,Go语言编译器尚未执行档案导引优化(PGO)。PGO使用有关代码运行时行为的信息来指导编译器优化,如内联、代码布局等。PGO可以将应用程序性能提高15-30% [LLVM、AutoFDO]。在这个方案中,我们用PGO扩展了Go语言的编译器。具体来说,我们将配置文件整合到编译器的前端,构建一个带有节点和边权重的调用图(称为**WeightedCallGraph**)。内联器随后使用WeightedCallGraph执行配置文件引导内联,积极内联热函数。我们引入了一个概要文件引导的代码专门化过程,它与内联器紧密集成,并消除了热代码路径中的间接方法调用开销。此外,我们使用IR指令的相关概要权重对其进行注解,并将这些注解传播到SSA级别,以促进概要引导的基本块布局优化,从而受益于更好的指令缓存和TLB性能。最后,我们扩展了Go语言的链接器,使其也可以直接使用概要文件,并跨包边界执行函数重新排序优化--这也有助于提高指令缓存和TLB的性能。我们的PGO使用的配置文件格式与pprof工具生成的protobuf格式相同。这种格式足够丰富,可以携带额外的硬件性能计数器信息,如缓存未命中、LBR等。Google现有的perf_data_converter工具可以将Linux perf生成的perf.data文件转换为protobuf格式的profile.proto文件。Go语言将为PGO提出一个新的编译流程
pprof
perf
WeightedCallGraph
perf_data_converter
perf.data
profile.proto
68bkxrlz2#
由于Go语言是一种编译语言,可执行文件不包含任何原始源代码,因此输出结果是不可能的。最接近于你想要的方法是在Debug模式下运行Go项目,并逐步执行每一行代码。这样你就可以在运行的时候决定跳转到一个函数或者只是执行它然后跳过它,因为调试器不知道你认为什么是“标准库”,什么应该逐行跟踪,什么不应该。另一方面,Go语言可以是多线程的,所以打印每一行执行可能会在一分钟内变得一团糟(有时我会同时运行不止一个例程)。
2条答案
按热度按时间sgtfey8w1#
您可以合并using pprof:
(
ofabry/go-callvis
也有助于查看调用图)请参见this guide中的“交互式配置”。
这不会按顺序显示执行的每一行,但允许您在运行后浏览执行的内容。
请注意,Go 1.20/1.21(2022年第4季度/2023年第2季度)将包括(因为接受了#55022):
第1001章:
Go语言程序中的低效可以通过
pprof
和linux profilerperf
这样的分析工具来隔离,这些工具可以精确地找出源代码中花费了大部分执行时间的区域。与LLVM等其他优化编译器不同,Go语言编译器尚未执行档案导引优化(PGO)。
PGO使用有关代码运行时行为的信息来指导编译器优化,如内联、代码布局等。PGO可以将应用程序性能提高15-30% [LLVM、AutoFDO]。
在这个方案中,我们用PGO扩展了Go语言的编译器。
具体来说,我们将配置文件整合到编译器的前端,构建一个带有节点和边权重的调用图(称为**
WeightedCallGraph
**)。内联器随后使用WeightedCallGraph
执行配置文件引导内联,积极内联热函数。我们引入了一个概要文件引导的代码专门化过程,它与内联器紧密集成,并消除了热代码路径中的间接方法调用开销。
此外,我们使用IR指令的相关概要权重对其进行注解,并将这些注解传播到SSA级别,以促进概要引导的基本块布局优化,从而受益于更好的指令缓存和TLB性能。
最后,我们扩展了Go语言的链接器,使其也可以直接使用概要文件,并跨包边界执行函数重新排序优化--这也有助于提高指令缓存和TLB的性能。
我们的PGO使用的配置文件格式与
pprof
工具生成的protobuf格式相同。这种格式足够丰富,可以携带额外的硬件性能计数器信息,如缓存未命中、LBR等。Google现有的
perf_data_converter
工具可以将Linuxperf
生成的perf.data
文件转换为protobuf格式的profile.proto
文件。Go语言将为PGO提出一个新的编译流程
68bkxrlz2#
由于Go语言是一种编译语言,可执行文件不包含任何原始源代码,因此输出结果是不可能的。最接近于你想要的方法是在Debug模式下运行Go项目,并逐步执行每一行代码。
这样你就可以在运行的时候决定跳转到一个函数或者只是执行它然后跳过它,因为调试器不知道你认为什么是“标准库”,什么应该逐行跟踪,什么不应该。
另一方面,Go语言可以是多线程的,所以打印每一行执行可能会在一分钟内变得一团糟(有时我会同时运行不止一个例程)。