我想知道是否有可用的技术或工具可以告诉您执行特定方法需要多长时间。
类似于数学/计算机科学中的大O符号,可以让您了解算法的复杂性,我想知道代码分析是否有类似的东西。
答案 0 :(得分:4)
Profiling是一种分析程序以确定在特定函数或方法中花费的相对时间量的方法。它对于根据经验发现程序中的性能问题很有用。例如,使用GCC,您可以:
使用-pg
选项编译程序以启用分析。
运行可执行文件以生成名为gmon.out
的文件,其中包含有关程序实际运行时的运行时特征的信息。
运行gprof
以显示已检测的可执行文件生成的信息。
一般来说,人类分析是发现特定算法的渐近(即大O)复杂性的唯一方法 - 据我所知,没有机械方法可以做到这一点。
答案 1 :(得分:2)
如果您想知道功能花费了多少时间,请使用所谓的“探查器”。
复杂性分析不在探查器的范围之内,因为探查器会告诉您在运行程序时会发生什么,而复杂性会告诉您当运行无限序列的程序时会发生的限制行为。更大的投入。
那么:你想知道哪些函数在你的程序中成本最高(在这种情况下找到你的C ++实现的探查器并遵循它的文档),或者你想知道时间复杂度(在这种情况下你很漂亮)非常需要人来分析你的代码吗?
答案 2 :(得分: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(用你的程序替换sage bench.py)https://github.com/titusnicolae/pynac-callgrind/blob/master/run.sh
编辑:如果您不打算稍后启用检测,则应从参数列表中删除“--instr-atstart = no”
答案 3 :(得分:0)
这与暂停问题有什么不同?
请注意,我可以使用您的自动复杂性分析仪轻松解决暂停问题 - 您的问题更加困难。停止问题已经不明确了。