2012-08-08 47 views
2

我想知道是否有可用的技术或工具可以告诉您需要多少时间来执行特定的方法。找到成本最高的方法并评估/剖析它们

一些类似于数学/计算机科学中的大O符号,可以给你一个算法的复杂性的想法,我不知道代码分析是否有类似的东西。

+0

你会如何回答自己这个问题计划? – 2012-08-08 23:59:02

+0

@KirillKobelev我想在可能的时候学习新东西。 – user827992 2012-08-09 00:00:45

回答

1

你应该尝试使用callgrind启动运行你的代码,它会记录被调用的函数的次数,但代码将运行速度慢20倍或等等。在获得callgrind输出后,您应该使用kcachegrind打开它以查看调用的树结构。在那里,你可以浏览一下,看看你有没有瓶颈

相关链接:
kcachegrind http://kcachegrind.sourceforge.net/html/Home.html
callgrind文档http://valgrind.org/docs/manual/cl-manual.html
(Valgrind是框架,callgrind是一个组件)
如何在程序启动callgrind产生过程并且你也想要描述这些过程(替换鼠尾草凳。与您的程序PY)https://github.com/titusnicolae/pynac-callgrind/blob/master/run.sh
编辑:“--instr-atstart =没有”应该被从参数列表中删除,如果你不扶持的仪器后

2

如果你想知道在一个函数中花了多少时间,使用一个所谓的“探查器”。但是,因为一个分析器告诉你当你运行一个程序时会发生什么,而复杂性告诉你当你运行一个无限序列的程序时会发生什么情况的限制行为和更大的投入。所以:你想知道哪些函数在你的程序中花费最大(在这种情况下,为你的C++实现找到一个分析器并且遵循它的文档),或者你想知道时间复杂度(在这种情况下,你几乎需要一个人来分析你的代码)?

0

这与停止问题有什么不同?

请注意,我可以使用自动复杂度分析器来解决暂停问题 - 你的问题是HARDER。而停止问题已经是不可判定的。

4

Profiling是分析程序以确定在特定函数或方法中花费的时间的相对量的手段。这对于凭经验发现程序中的性能问题很有用。使用GCC,例如,您可以:

  • -pg选项来启用分析编译程序。

  • 运行可执行文件以生成一个名为gmon.out的文件,该文件包含程序实际运行时的运行时特征信息。

  • 运行gprof以显示由插装的可执行文件生成的信息。

一般来说,人的分析是发现渐近(即,大O)的复杂性的唯一途径特定算法,有,所以据我所知,没有机械的方式来做到这一点。