Ruby on rails 使用Ruby配置文件跟踪RSpec中的缓慢执行

Ruby on rails 使用Ruby配置文件跟踪RSpec中的缓慢执行,ruby-on-rails,ruby,profiling,rspec,jruby,Ruby On Rails,Ruby,Profiling,Rspec,Jruby,我有一堆rspec测试,它们运行的时间太长了。我试图找出瓶颈所在,合理的起点是使用标准库概要文件库。在这种特殊情况下,JRuby 1.5.2正在执行。以下是在我的规范中嵌入配置文件库后的输出: % cumulative self self total time seconds seconds calls ms/call ms/call name 0.37 0.37 0.37 69 5.33

我有一堆rspec测试,它们运行的时间太长了。我试图找出瓶颈所在,合理的起点是使用标准库概要文件库。在这种特殊情况下,JRuby 1.5.2正在执行。以下是在我的规范中嵌入配置文件库后的输出:

 %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
  0.37     0.37      0.37       69     5.33     5.33  #<Class:#<Object:0x99b2a1d>>#include
  0.01     0.38      0.01      208     0.06     0.06  String#fast_xs
  0.00    98.99      0.00        1     0.00 98987.00  #toplevel
%累计自我总计
时间秒秒呼叫ms/呼叫ms/呼叫名称
0.37 0.37 0.37 69 5.33 5.33包括
0.01 0.38 0.01 208 0.06 0.06字符串#快速
0.00 98.99 0.00 1 0.00 987.00#顶级

我需要研究一下为什么会有208个对String#fast#xs的调用,但这里真正的问题是#toplevel中到底发生了什么?有一个98987.00ms的延迟被花费在那里的东西上,我需要一个更精细的方式来查看故障,以了解我可以在规范测试中更改什么来加快速度。

您有多少个测试?每个RSpec测试都会重新加载整个Rails环境,因此如果您有大量的测试,那么开销很可能来自于此。您可以查看在运行测试时仅加载环境一次的测试服务器


如果你正在做大量的测试并且在缓慢的测试中遇到问题,那么使用Spork的Ruby-on-Rails教程就可以了。

像这样的问题太多了。显示了一些概要文件输出,问题是:“发生了什么?”

没有必要对概要文件的输出感到困惑。你可以。他们花的时间越多,就越容易找到

任何涉及自我时间、每次通话的毫秒数、通话次数等的事情都会被困在网络的陷阱中

补充:例如

  • self-time(exclusive)基于这样一个前提,即您可以浪费时间的唯一方法是不调用函数。当函数被不必要地调用时,您希望查找并删除这些函数,或者如果IO被不必要地调用,它不会在自时中显示。如果仅在程序被解除阻止时采集样本,则IO和其他阻塞时间根本不会显示

  • 每次调用的毫秒数(含毫秒)乘以函数的调用计数,再除以总时间,得到函数负责的时间分数。只有这三个数字中的两个,您无法判断函数是否花费了太多时间

  • 如果你能判断一个函数是否占了很大部分的时间,那么你仍然需要找到函数中负责时间的行。 如果探查器的行为就像您关心的唯一单元是函数一样,那么您仍然需要做侦探工作


    • jruby prof gem可能会对您有所帮助。ruby prof gem for MRI可能也会有很好的帮助。

      除非JRuby有Spork的叉子(没有双关语),否则我认为Spork与JRuby目前的情况不太一样。哦!抱歉,错过了那个小细节。慢的部分是在运行所有测试之前,还是在每次测试之前?如果您在(:all)之前使用了大量的
      过滤器,那么它们会在创建的每个上下文上运行(通过
      描述
      上下文
      ),这有点违反直觉和令人失望。这不应该被标记为
      评测
      ,而不是
      基准测试
      ?。另外,你看了相关的问题了吗?关于迈克建议的技巧,请看@Andrew:@randombits:这是我第一次尝试介绍这个问题。从那时起,我对解释进行了改进,并解决了人们倾向于提出的各种反对意见。许多其他人已经独立地站到了同样的立场,但似乎并不想告诉人们这件事,也许是因为他们不像我那样是学者。@Andrew:@randombits:我特别想到了这些:()他们做堆栈采样,在墙上计时,并按行报告百分比,忽略递归。你如何在jruby中“暂停”程序?调试器支持非常有限。这可不像在GUI ide中单击“停止”按钮那么简单。@Scott:我只是在谷歌上搜索了“jruby调试器”并搜索了“中断”和“堆栈”。听起来好像Ctrl-C会中断它,“where”将以行级分辨率显示堆栈。它与GDB没有太大区别。这样行吗?