Go 如何以图形方式可视化配置文件?

Go 如何以图形方式可视化配置文件?,go,profiling,Go,Profiling,我正在Windows 8.1 64位上开发Go 1.2。要让go-pprof工具正常工作,我遇到了很多问题,比如显示内存地址而不是实际的函数名 然而,我发现它似乎在生成配置文件方面做得很好,它与pprof工具一起工作。我的问题是,如何使用这些配置文件进行图形可视化 U可以尝试go-tool-pprof/path/to/profile.prof来解决函数不正确的问题 如果您想要图形可视化,请尝试在pprof中输入web。如果您的目标是看到漂亮但基本上没有意义的图片,请按照@Specode的建议进行

我正在Windows 8.1 64位上开发Go 1.2。要让go-pprof工具正常工作,我遇到了很多问题,比如显示内存地址而不是实际的函数名


然而,我发现它似乎在生成配置文件方面做得很好,它与pprof工具一起工作。我的问题是,如何使用这些配置文件进行图形可视化

U可以尝试
go-tool-pprof/path/to/profile.prof
来解决函数不正确的问题


如果您想要图形可视化,请尝试在pprof中输入
web

如果您的目标是看到漂亮但基本上没有意义的图片,请按照@Specode的建议进行可视化

如果你的目标是速度,那么我建议你忘记可视化。 可视化不会告诉您需要修复什么

您可以在GDB中非常有效地执行此操作

编辑以响应@BurntSushi5:

以下是我的“图形抱怨”:

首先,他们非常容易被愚弄。 例如,假设A1花费所有时间调用C2,反之亦然。 然后假设插入了一个新的例程B,这样当A1调用B时,B调用C2,当A2调用B时,B调用C1。 每次调用C2时,图形都会丢失信息,A1在堆栈上位于C2之上,反之亦然

例如,假设对C的每个调用都来自A。 然后假设一个“分派”到一组函数B1,B2,…,每个函数调用C。 该图丢失了每个对C的调用都通过A进行的信息

现在转到链接的图形:

  • 它非常强调自我时间,制作巨大的盒子,而包容性时间更为重要。(事实上,
    gprof
    被发明的全部原因是因为自拍时间几乎和只有一个秒针的时钟一样有用。)他们至少可以通过包含时间的方式来缩放盒子

  • 它没有说明调用来自的代码行,也没有说明花费自己时间的代码行。它基于所有函数都应该很小的假设。也许这是真的,也许不是,但这是否足以成为概要文件输出没有帮助的理由

  • 它塞满了无关紧要的小盒子,因为它们的时间微不足道。他们所做的只是占用大量的房地产,分散你的注意力

  • 这里没有关于I/O的任何内容。图形来自的分析器显然体现了唯一的I/O是必需的I/O,因此没有必要对其进行评测(即使它占用了90%的时间)。在大型程序中,I/O很容易完成,这实际上是不必要的,占用了很大一部分时间,而所谓的“CPU分析器”甚至有一种偏见,认为它根本不存在

  • 该图中似乎没有任何递归实例,但递归是常见且有用的,并且图形很难用有意义的度量来显示它

只需指出,如果采集少量堆栈样本,其中大约一半会是这样:

blah-blah-couldn't-read-it
blah-blah-couldn't-read-it
blah-blah-couldn't-read-it
fragbag.(*structureAtoms).BestStructureFragment
structure.RMSDMem
... a couple other routines
另一半的样本正在做其他事情,同样具有信息量。 由于每个堆栈示例都会向您显示调用来自的代码行,因此您实际上会被告知花费时间的原因。 (不花太多时间的活动被抽样的可能性很小,这很好,因为你不在乎这些。)


现在我不知道这段代码,但图表让我强烈怀疑,就像我看到的许多代码一样,数据结构中存在魔鬼。

我已经多次使用与Go工具捆绑的探查器来成功优化我的程序。这包括使用探查器生成的“无意义”调用图。@BurntSushi5:a)您的程序是大还是小?分析器在小程序上工作得很好。b) 你得到了多少加速?人们对小提速很满意——他们认为这就是全部。广泛的节目。一些小的一些大的。而且,这个图表看起来不是很有用。百分率都是100%!下面是我使用的一种图形,它是从Go工具链生成的:我不跟踪我得到的每一个速度,但我经常编写可能需要几天才能运行的幼稚代码。在分析器的帮助下,我有时能把时间缩短到几个小时或几分钟。(这通常是一个更智能地分配的问题,分析器在这方面帮助很大。)请注意,我并不认为我的方法更好。我只是声称这些图表是有意义的,我的证据是我已经用它们来调整我的程序,使其产生巨大的效果。