Rails partials渲染具有10x尖峰渲染时间

时间:2013-04-03 18:45:55

标签: ruby-on-rails ruby partial-views mvc-mini-profiler

查看ruby mini-profiler输出我注意到这个5-6个部分的模式在每个约6-7毫秒渲染,然后一个渲染在关闭60-70毫秒。我想知道是什么会导致这种情况,它看起来像是某种潮红。视图渲染开始时加载所有模型数据,所以我知道不是由延迟加载引起的。

 Rendering: application/_row     7.1    +1107.0 
 Rendering: application/_row     68.7   +1115.0 
 Rendering: application/_row     6.7    +1184.0 
 ...     
 Rendering: application/_row     6.5    +1234.0 
 Rendering: application/_row     65.2   +1241.0 
 Rendering: application/_row     6.6    +1306.0 
 ...     
 Rendering: application/_row     6.6    +1321.0 
 Rendering: application/_row     66.6   +1328.0 
 Rendering: application/_row     6.6    +1395.0 
 ...     
 Rendering: application/_row     6.6    +1444.0 
 Rendering: application/_row     65.4   +1451.0 

Ruby 1.9.3p194,Rails 3.2.11

1 个答案:

答案 0 :(得分:5)

这是最确定的MRI的垃圾收集器刷内存。我使用简单的Rails应用程序和部分测试进行了一些测试:

100.times{Test.new}

我可以看到像你一样的尖峰:

Rendered tests/_row.html.erb (3.9ms)
Rendered tests/_row.html.erb (45.3ms)
Rendered tests/_row.html.erb (5.2ms)
...
Rendered tests/_row.html.erb (42.8ms)

使用mini-profiler,可以很容易地检查GC被调用的次数,更重要的是,它运行了多长时间。对我来说,这些数字非常匹配。如果有10个尖峰,那么还有10个(+/- 1)GC调用,并且GC的运行时间恰好是正常渲染和花费更长时间的渲染之间的差异。

要使用迷你探查器的GC计时器,请将?pp=profile-gc-time附加到您的网址。还有一篇关于tuning Ruby与mini-profiler的好文章。