使用标准调试器调试性能问题几乎没有希望,因为细节级别太高。其他方式使用分析器,但它们很少给我提供良好的信息,特别是当涉及GUI和后台线程时,因为我从来不知道用户是否实际上在等待计算机。另一种方法是使用Control + C并查看代码中的停止位置。
我真正想要的是快速前进,播放,暂停和倒带功能以及代码的一些视觉代表。这意味着我可以将代码设置为在Fast Forward上运行,直到我将GUI导航到关键位置。然后我将代码设置为以慢速模式运行,同时我得到一些视觉表示,正在执行哪些行(可能是某种缩小的代码视图)。例如,我可以将执行速度设置为0.0001x。我相信我会以这种方式获得非常好的可视化,无论问题是在特定模块内部,还是在模块之间的通信中。
这是否存在?我的具体需求是在Python中,但我有兴趣在任何语言中看到这样的功能。
答案 0 :(得分:4)
任何调试器中都存在“Fast Forward to critical spot”功能,它被称为“断点”。确实有调试器可以减慢执行速度,但这不会帮助您调试性能问题,因为它不会减慢计算机速度。处理器,磁盘和内存仍然和以前一样慢,所有发生的事情是调试器在每行代码之间插入延迟。这意味着每行代码突然或多或少地同时发生,这意味着它隐藏了性能问题所在的任何痕迹。
找到性能问题的唯一方法是记录应用程序中完成的每个调用以及花费的时间。这就是分析器的功能。实际上,使用分析器很棘手,但可能没有更好的选择。从理论上讲,你可以记录每次通话和每次通话的时间,然后通过倒带来回放和转发,但这将使用惊人的内存量,而且它实际上不会告诉你任何东西,而不是分析器(事实上,它会告诉你更少,因为它会错过某些类型的性能问题。)
你应该能够通过剖析器找出需要很长时间的事情。请注意,这可能是某些函数调用需要很长时间,因为它们会进行大量处理,或者可能是需要很长时间的系统调用(网络/磁盘)很慢。或者可能是一个非常快速的呼叫称为负载和负载。分析器将帮助您解决这个问题。但是,如果您可以在关键部分打开探测器(降低噪音),并且可以多次运行该关键部分(提高准确性),这会有所帮助。
答案 1 :(得分:1)
我认为应用执行中有一个阶段需要太长时间 - 即它会让你等待。 我认为你真正想要的是看你能改变什么来加快速度。
有效的技术是random-pausing。 您在调试器下运行应用程序,并在其执行部分让您等待,暂停它,并检查调用堆栈。这样做几次。
以下是您的计划可能花费更多时间而非必要的方式。
无论它是什么,当它发生时,对调用堆栈的检查将显示它。 一旦你知道它是什么,你就可以找到一种更好的方法,或者根本不去做。
如果程序花了1秒时花了5秒钟,那么每次暂停时你会看到问题的概率是4/5。实际上,您在多个堆栈示例中看到的任何函数调用,如果您可以避免这样做,将为您带来显着的加速。 并且,几乎每个可能的瓶颈都可以通过这种方式找到。
不要考虑功能时间或它们被调用的次数。查找经常出现在堆栈上的代码行,这些代码行是您不需要的。
示例已添加:如果您取出堆叠的5个样本,并且其中2个出现了一行代码,则它负责约2/5 = 40%的时间,给予或接受< / em>的。你不知道确切的百分比,你不需要知道。 (从技术上讲,平均而言是(2 + 1)/(5 + 2)= 3/7 = 43%。不错,而且你确切知道它在哪里。)
答案 2 :(得分:1)
您所描述的方法以及许多评论在我看来是理解性能影响的相对较弱的概率尝试。对于GUI和其他空闲线程程序,Profilers确实可以很好地工作,尽管需要一些练习来阅读它们。我认为你最好的选择就是 - 学会更好地使用探查器,这就是它的用途。
您描述的具体用途只是附加分析器但尚未记录。将GUI导航到相关点。点击探查器记录按钮,执行操作,然后停止录制。查看结果。固定。再做一次。