Profiling Ruby Code

10 浏览
0 Comments

Profiling Ruby Code

除了ruby-prof和核心Benchmark类,你还使用什么来对你的Ruby代码进行分析?特别是,你如何找到代码中的瓶颈?我几乎觉得我需要开发自己的小工具来找出代码中时间花在了哪里。\n我知道ruby-prof可以提供这个功能,但输出结果实在很令人困惑,很难找出哪些实际的代码块是问题的根源(它只告诉你哪些方法调用花费了最多的时间)。所以我没有从中获取到想要的结果,也无法充分利用它。\n也许我用错了方法?是否有替代方案?谷歌搜索对我没有帮助。

0
0 Comments

问题出现的原因:在Ruby代码中存在性能问题,但通过查看backtraces(回溯)来定位问题是繁琐和不直观的。

解决方法:使用flame graphs(火焰图)来进行性能分析和定位问题。

文章内容如下:

在Ruby代码中,有时候我们可能会遇到性能问题。为了解决这个问题,我发现了一个非常神奇的工具,它可以帮助我们进行性能分析。这个工具就是flame graphs。

相对于查看backtraces(回溯),flame graphs可以更加直观地展示代码的性能问题。回溯虽然能够找出一部分性能问题,但是对于整个代码的优化来说,是不够全面的。想要了解为什么回溯不能找到所有的优化点,可以参考这篇文章(Here's why.)。

通过使用flame graphs,我们可以更加清晰地看到代码中存在的性能问题。这对于优化代码非常有帮助。flame graphs的使用方法可以参考这篇文章:http://samsaffron.com/archive/2013/03/19/flame-graphs-in-ruby-miniprofiler

,通过使用flame graphs,我们可以更加方便地进行性能分析和优化Ruby代码。相比于传统的查看backtraces的方法,flame graphs可以更加直观地展示代码中的性能问题。这对于提高代码的执行效率非常有帮助。

0
0 Comments

Profiling Ruby Code

在编写和优化Ruby代码时,我们经常会遇到性能问题。我们希望能够找出代码的“瓶颈”,即导致程序运行缓慢的部分,然后对其进行优化。然而,许多分析工具并不能很好地解决这个问题。它们只告诉我们程序花费时间的位置,而不是为什么会花费时间。因此,我们需要一种方法来找出代码的瓶颈所在以及解决方法。

一种常见的方法是测量代码的执行时间,以确定哪些部分需要优化。然而,我们可以采用一种更高效的方法来找到问题所在。我们可以通过暂停代码的运行并查看堆栈来找到问题。我们只需要暂停一次,并仔细研究堆栈上的代码。如果需要,我们可以多次暂停以确保我们找到了问题所在。

假设我们的代码执行时间只比必要的时间长一倍。这意味着当我们暂停代码时,有50%的机会能够看到它执行不必要的操作。如果我们暂停并查看代码10次,大约会发现它在5次中执行了不必要的操作。事实上,一旦我们在2个样本中看到它执行了某些可以优化的操作,我们就找到了一个“瓶颈”。修复它,测量加速效果,展示成果,然后重复这个过程。

即使我们的最大问题不是很大,这种方法最终也能找到它。

此外,还存在一种放大现象,即在消除较大问题后,较小问题变得更容易找到。这使我们能够持续进行优化,直到代码几乎达到最优。

当然,在进行代码优化后,可能仍然存在提升的机会。例如,优化算法可能取决于数值稳定性。基于消息驱动的架构可能会使追踪代码执行的原因变得更困难。在实时软件中,性能问题可能只会偶尔发生,并且不容易采样。这需要更为聪明的方法,仅仅进行测量是不够的。

总之,我们可以通过暂停代码并查看堆栈来找到代码的瓶颈,然后对其进行优化。这种方法比仅仅测量代码执行时间更加高效。并且,通过不断优化并消除大问题,我们还可以发现和解决更小的问题,最终将代码优化到接近最优的状态。

所以,在优化Ruby代码时,我们可以尝试使用这种方法来找到和解决代码的瓶颈问题。这将使我们能够更好地理解代码的运行情况,从而进行有针对性的优化。

0
0 Comments

在这篇文章中,我们将介绍如何通过使用stackprof来对Ruby代码进行分析和优化。

问题:

当我们的Ruby代码运行缓慢时,我们需要找出造成这种情况的原因。为了解决这个问题,我们可以使用stackprof工具。

解决方法:

首先,我们需要安装stackprof gem,可以通过运行命令"gem install stackprof"来安装。

然后,在我们的代码中添加"require 'stackprof'"语句,并使用以下代码将我们想要检查的部分包围起来:

StackProf.run(mode: :cpu, out: 'stackprof-output.dump') do

{YOUR_CODE}

end

在运行Ruby脚本后,可以使用"stackprof stackprof.dump"命令在终端中查看输出:

Mode: cpu(1000)

Samples: 9145 (1.25% miss rate)

GC: 448 (4.90%)

TOTAL (pct) SAMPLES (pct) FRAME

236 (2.6%) 231 (2.5%) String#blank?

546 (6.0%) 216 (2.4%) ActiveRecord::ConnectionAdapters::Mysql2Adapter#select

212 (2.3%) 199 (2.2%) Mysql2::Client#query_with_timing

190 (2.1%) 155 (1.7%) ERB::Util#html_escape

在这里,我们可以看到所有需要大量时间的方法。现在,让我们来看一下如何更详细地分析这些方法。只需运行"stackprof stackprof.dump --method String#blank?"命令,即可获得特定方法的输出:

String#blank? (lib/active_support/core_ext/object/blank.rb:80)

samples: 231 self (2.5%) / 236 total (2.6%)

callers:

112 ( 47.5%) Object#present?

code:

| 80 | def blank?

187 (2.0%) / 187 (2.0%) | 81 | self !~ /[^[:space:]]/

| 82 | end

通过这些输出,我们可以很容易地找出代码中运行时间较长的部分。

如果想要获得可视化输出,可以运行"stackprof stackprof.dump --graphviz >> stackprof.dot"命令,并使用graphviz工具将输出转换为PDF格式,具体命令如下:

dot -T pdf -o stackprof.pdf stackprof.dot

这样,我们就可以得到一个漂亮的PDF输出,其中突出显示了运行时间较长的方法。

通过使用stackprof进行代码分析和优化,我们可以更好地了解代码中的性能问题,并针对性地进行优化,提高代码的运行效率。

0