5

看着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

4

1 回答 1

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 的运行时间正是正常渲染和耗时更长的渲染之间的差异。

要使用 mini-profiler 的 GC 计时器,请附加?pp=profile-gc-time到您的 URL。还有一篇关于使用 mini-profiler调整 Ruby的好文章。

于 2013-04-03T20:14:07.583 回答