Go Can';我无法让戈朗停止工作

Go Can';我无法让戈朗停止工作,go,profiling,pprof,Go,Profiling,Pprof,我曾尝试分析一些golang应用程序,但无法实现,我遵循了以下两个教程: 两者都表示,在向应用程序添加一些代码行后,您必须执行应用程序,我这样做了,并在屏幕上收到以下消息: 2015/06/16 12:04:00配置文件:cpu配置文件已启用, /var/folders/kg/4fxym1sn0bx02zl_2sbmrhr9wjvqt/T/profile68079962/cpu.pprof 因此,我知道正在执行分析,将信息发送到文件 但是,在我测试的任何程序中,当我看到文件大小时,它总是

我曾尝试分析一些golang应用程序,但无法实现,我遵循了以下两个教程:

两者都表示,在向应用程序添加一些代码行后,您必须执行应用程序,我这样做了,并在屏幕上收到以下消息:

2015/06/16 12:04:00配置文件:cpu配置文件已启用, /var/folders/kg/4fxym1sn0bx02zl_2sbmrhr9wjvqt/T/profile68079962/cpu.pprof

因此,我知道正在执行分析,将信息发送到文件

但是,在我测试的任何程序中,当我看到文件大小时,它总是64字节

当我尝试用pprof打开cpu.pprof文件并执行“top10”命令时,我发现文件中没有任何内容:

(“/事实”是我的应用程序)

去吧。/事实 /var/folders/kg/4fxym1sn0bx02zl_2sbmrhr9wjvqt/T/profile68079962/cpu.pprof

top10-->

(pprof)前10名,共0名(0%) 单位百分比总和百分比总和百分比

所以,当我分析时,好像什么都没有发生

我已经在mac(本例)和ubuntu中用三种不同的程序对它进行了测试

你知道我做错了吗

然后示例程序非常简单,这是代码(是一个非常简单的阶乘程序,我从互联网上获取):

谢谢,
Fer

问题在于您的函数运行太快,pprof无法对其进行采样。尝试在
事实
调用周围添加一个循环,并对结果求和,以人为地延长程序。

正如inf已经提到的,您的代码执行得太快。原因是pprof的工作原理是在程序执行过程中反复停止程序,查看此时正在运行的函数并将其记录下来(连同整个函数调用堆栈)。以每秒100个样本的速率采集样本。这是在runtime/pprof/pprof.go中硬编码的,您可以轻松检查(请参见第575行及其上方的注释):

}

程序运行的时间越长,可以进行的采样就越多,短时间运行的函数也被采样的可能性就越大。如果您的程序在生成第一个示例之前完成,则生成的cpu.pprof将为空

从上面的代码中可以看到,采样率设置为

runtime.SetCPUProfileRate(..)
如果在调用StartCPUProfile()之前使用另一个值调用runtime.SetCPUProfileRate(),则可以覆盖采样率。在程序执行期间,您将收到一条警告消息,告诉您“运行时:在上一个配置文件完成之前无法设置cpu配置文件速率”。您可以忽略该消息。由于pprof.go再次调用SetCPUProfileRate(),因此会产生此结果。由于已设置该值,因此将忽略pprof中的值

此外,Dave Cheney发布了其分析工具的新版本,您可以在此处找到:。除其他更改外,您还可以在此处指定写入cpu.pprof的路径:

defer profile.Start(profile.CPUProfile, profile.ProfilePath(".")).Stop()
您可以在此处阅读:


顺便说一句,fact()函数将很快溢出,即使将int64作为参数并返回值。30! 大约为2*10^32,int64最多只能存储2^63-1的值,大约为9*10^18。

首先,您使用的是什么操作系统?其次,
pprof
是一个“采样分析器”,您没有做任何可以采样的事情。您的应用程序需要在相当长的时间内持续执行指令,以积累足够的样本(使用net/http/pprof时,默认样本时间为30秒)。我正在使用OSX 10.10.2(约塞米蒂)。我现在正在尝试在很长一段时间内使用该配置文件,现在我看到该文件有更多信息:)谢谢!然后你也需要阅读以下内容:谢谢,我会试试,我会告诉你结果!!:)我现在看到,在为{;;}添加了一个for和一个sleep之后,该文件有了更多的信息。谢谢:)
runtime.SetCPUProfileRate(..)
defer profile.Start(profile.CPUProfile, profile.ProfilePath(".")).Stop()