我知道我可以使用Linuxgprof
和kprof
在 Linux 上分析我的代码。在 Windows 上是否有与这些应用程序类似的替代方案?
4 回答
有一个 gprof 的 MinGW 端口,其工作方式与 Linux 变体几乎相同。您可以获取完整的MinGW 安装(我认为包含 gprof 但不确定)或从MinGW binutils 包中获取 gprof 。
对于 Eclipse,有TPTP,但据我所知,它不支持分析 C/C++。
商业软件:
- Rational Quantify(昂贵,缓慢,但非常详细)
- AQTime(更便宜,更慢,有点详细)
免费软件:
- 非常困(www.codersnotes.com)
- 卢克 StackWalker ( lukestackwalker.sourceforge.net )
这些商业替代品通过向其“插入”(添加指令)来更改已编译的代码,并使用添加的指令执行计时。这意味着它们会导致您的应用程序严重变慢。
这些免费的替代品使用采样,这意味着它们不太详细,但速度非常快。在实践中,我发现,特别是“非常困”非常适合快速查看应用程序中的性能问题。
是的,您可以使用 Visual Studio分析代码
剖析的原因是什么?您想 a) 测量时间并获得调用图,还是 b) 找到要更改的内容以使代码更快?(这些不一样。)
如果(b)你可以使用这个技巧,使用 Eclipse 中的 Pause 按钮。
补充:也许它有助于传达一些关于性能问题的实际情况以及您可以在哪里找到它们的经验。下面是一些简单的例子:
插入排序(顺序 n^2),其中被排序的项目是字符串,并由字符串比较函数进行比较。热点在哪里?在字符串比较中。哪里有问题?在调用字符串比较的排序中。如果n=10没问题,但是如果n=1000,突然就需要很长时间了。调用字符串比较的地方是“冷”,但这就是问题所在。调用堆栈的少量样本可以确定地确定它。
加载插件的应用程序需要很长时间才能启动。分析器说基本上里面的所有东西都是“冷的”。测量 I/O 时间的东西说它几乎是所有的 I/O 时间,这似乎是您所期望的,所以它可能看起来毫无希望。但是,堆栈样本显示,在读取插件 dll 的资源部分以将字符串常量转换为本地语言的过程中,堆栈大约 20 层的深度花费了很大一部分时间。进一步调查,您会发现大多数正在翻译的字符串并不是真正需要翻译的那种。他们只是被放在“以防万一”他们可能需要翻译,并且从未被认为是可能导致性能问题的东西。解决这个问题可以节省大量时间。
因此,通常从“热点”和“瓶颈”的角度来思考,但大多数程序,尤其是较大的程序,往往会以函数调用的形式出现性能问题,请求的工作并不真正需要完成。幸运的是,它们在所花费的时间内显示在调用堆栈上。