除了ruby-prof和核心Benchmark类之外,您还使用什么来分析Ruby代码?特别是,如何在代码中找到瓶颈?几乎感觉就像我需要使用自己的小工具才能弄清楚代码中所有时间都花在了哪里。

我意识到ruby-prof提供了此功能,但坦率地说,输出非常令人困惑,并且很难找出问题所在(实际上,它告诉您哪种方法调用花费的时间最多)虽然)。因此,我并没有从中获得太多 yield ,也没有真正能够利用它。

也许我做错了吗?有其他选择吗? Google搜索不会为我带来任何好处。

最佳答案

很多分析器就是这样。
您需要知道的不是程序花在哪里的时间,而是原因。 Any references on Dynamic Code Analysis?

添加:Here's how我在代码中发现了“瓶颈”。 (我讨厌这个词。)
Here's a list原因。

假设要发现“瓶颈”,您必须以某种方式进行大量测量是完全自然的。
很自然,几乎所有分析器都基于它。

实际上,查找和度量不是相同的问题。需要进行测量以查看您发现(和修复)的内容是否有所作为。对我来说,找到要解决的问题更像是调试而不是测量。

解释它的最简单方法是从无限或几乎无限的循环开始。你是怎么找到它的?您暂停一下,看看堆栈,对不对?因为您知道问题出在堆栈的某个地方。您只需要暂停一次,然后就需要研究堆栈上的代码。如果要确保已找到它,请暂停几次。

假设代码只花费必要时间的两倍。这意味着当您暂停它时,有50%的机会您会看到它在做不必要的事情。如果您暂停播放并观看10次,则大约会捕捉5次。实际上,只要您看到它可以对多达2个样本进行优化的工作,您就会发现“瓶颈”。修复它,测量加速比,炫耀它,然后重复。

即使您最大的问题不是很大,此方法最终也会找到它。
此外,还有一个放大现象,即删除较大的问题后,更容易发现小问题。这样一来,您就可以继续工作,直到代码接近最佳为止。

附言完成此操作后,可能仍然有加速的机会。例如,优化算法可能取决于数值稳定性。消息驱动的体系结构可能会更难追踪为什么执行代码。在实时软件中,性能问题可能仅偶尔发生,并且不太容易采样。这需要更多的聪明。仅仅依靠测量并不能做到这一点。

关于ruby - 分析Ruby代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4092641/

10-08 22:35
查看更多