2011-03-24 173 views
6

使用标准调试器调试性能问题几乎是无望的,因为细节级别过高。其他方式使用探查器,但他们很少给我提供良好的信息,特别是当涉及到GUI和后台线程时,我不知道用户是否真的在等待计算机,或者不知道。一种不同的方式是简单地使用Control + C并查看代码停止的位置。使用>>,>,> |,||,| <,<,<<,<<

我真正想要的是具有快进,播放,暂停和倒带功能以及代码的一些视觉表现。这意味着我可以设置代码在Fast Forward上运行,直到我将GUI导航到关键点。然后,我将代码设置为以慢速模式运行,同时获得一些视觉声明,正在执行哪些行(可能是某种缩小的代码视图)。例如,我可以将执行速度设置为0.0001x。我相信我会以这种方式获得一个非常好的可视化,不管这个问题是在特定的模块内还是在模块之间的通信中。

这是存在吗?我的具体需求是在Python中,但我会对以任何语言查看这些功能感兴趣。

+2

调用'fire_all_employees()'或'system('rm -rf /')'后,'rewind'可能很难。但我喜欢一般的想法...... :) – sarnold 2011-03-24 09:23:34

+1

它只需要倒带代码执行的可视化。我喜欢自动解雇员工的想法,因为这是一项非常乏味的任务。 ;) – David 2011-03-24 09:24:55

+1

所以你想要的东西类似于[Omniscient Debugger](http://www.lambdacs.com/debugger/),对吧? [TOD](http://pleiad.dcc.uchile.cl/tod/index.html)是另一个例子。不过,它们都是为Java而设计的。 – 2011-03-24 09:28:43

回答

4

任何调试器中都存在“快进至临界点”功能,它被称为“断点”。确实有一些调试器可能会降低执行速度,但这不会帮助您调试性能问题,因为它不会减慢计算机速度。处理器,磁盘和内存仍然与以前一样缓慢,所发生的只是调试器在每行代码之间插入延迟。这意味着每一行代码突然或多或少地在同一时间,这意味着它隐藏了性能问题出现的任何痕迹。

找到性能问题的唯一方法是记录在应用程序中完成的每个调用以及需要多长时间。这是一个分析器的功能。事实上,使用探查器是棘手的,但可能没有更好的选择。从理论上讲,您可以记录每次通话和每次通话的时间,然后播放后退和前进,但这会占用大量的记忆,实际上它不会告诉您任何事情,除了探查器所做的事情事实上,它会告诉你更少,因为它会错过某些类型的性能问题)。

您应该可以通过探查器找出需要很长时间的问题。请注意,这可能是由于某些函数调用需要很长时间,因为它们执行了大量处理,或者可能是需要很长时间的系统调用变得很慢(网络/磁盘)变慢。或者可能是一个非常快速的呼叫被称为负载和负载的时间。分析器将帮助你弄清楚这一点。但是,如果您只需在关键部分打开Profiler(减少噪音),并且您可以多次运行该关键部分(提高准确性),它就会有所帮助。

+1

第3段,句子2和3,我同意(没有太多其他的:-)我认为唯一的配置文件很好的是1)对调用栈进行采样(不仅仅是PC),2)可以在I/O和计算,3)逐行报告(不只是函数)包含行的样本百分比(不是调用计数,不是时间测量,特别是不是“自我时间”(Grrr ...),以及4)您可以控制何时取样。 [见此]。(http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343) – 2011-03-24 13:57:03

+0

@Mike:我绝对没有声明要使用哪种类型的探查器或它的功能,除了它应该能够仅分析关键部分。所以你对某个特定分析器的要求并不违背我所说的任何事情。 – 2011-03-24 14:54:21

+0

@lennart:对,你打开了剖析器的类型。这只是你说的“找到性能问题的唯一方法就是记录应用程序中完成的每个调用以及花费多长时间,这是一个分析器的功能。”你不是一个人这么想,这就是我认为的人与人之间的解决他们的表现问题。 – 2011-03-24 15:01:40

1

我认为应用程序执行过程中有一个阶段需要花费很长时间 - 即让您等待。 我想你真的想看看你可以改变,以使其更快。

有效的技术是random-pausing。 您在调试器下运行该应用程序,并在其执行的部分中让您等待,暂停它并检查调用堆栈。这样做几次。

这里有一些方法可能会花费更多的时间,而不是必要的。

  • 你不知道和不真正需要的I/O。
  • 非常频繁地分配和释放对象。
  • 关于数据结构的失控通知。
  • 其他不胜枚举...

不管它是什么,当它发生时,调用堆栈的考试将证明这一点。 一旦你知道它是什么,你可以找到一个更好的方法来做到这一点,或者根本就没有做到。

如果程序需要5秒钟时间可能需要1秒钟,那么您在每次暂停时将看到问题的概率为4/5。事实上,如果你可以避免这样做,任何你在多个堆栈样本上看到的函数都会给你一个显着的提速。 而且,几乎所有可能的瓶颈都可以通过这种方式找到。

不要考虑函数时间或者它们被调用的次数。寻找经常出现在堆栈上的代码行,你不需要。

示例添加:如果您取5个堆栈样本,并且其中2个出现一行代码,则它负责大约2/5 = 40%的时间,给予或带走。你不知道确切的百分比,你不需要知道。 (技术上,平均来说它是(2 + 1)/(5 + 2)= 3/7 = 43%。还不错,并且你确切知道它在哪里)。

1

你正在描述的方法,并且许多评论似乎对理解性能影响的概率性尝试相对较弱。对于GUI和其他空闲线程程序,Profiler确实很好地工作,尽管需要一些练习来阅读它们。我认为你最好的选择就是在那里 - 学会更好地使用profiler,这就是它的用途。

您描述的具体用途仅仅是附加探查器,但不记录。将GUI导航到问题点。点击分析器记录按钮,执行操作并停止录制。查看结果。固定。再来一遍。

相关问题