2013-04-03 29 views
5

Patrząc ruby mini-profiler wyjście Zauważyłem ten wzór 5-6 częściowych renderowania na około 6-7 ms każdy, a następnie jeden rendering na off 60-70 ms. Zastanawiałem się, co by to spowodowało, wygląda na to, że coś w tym stylu. Wszystkie dane modelu są ładowane po rozpoczęciu renderowania widoku, więc wiem, że nie jest to spowodowane leniwym ładowaniem.Railsowanie części renderowanie ma 10x skoki renderowania czasu

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, Szyny 3.2.11

+1

* Mógłby być GC. Chociaż 60ms wydaje się dość długi. –

+0

Widzę, że to się dzieje cały czas w rozwoju. Chciałbym wiedzieć, dlaczego tak się dzieje. – Swards

+0

zapomniałem wspomnieć: rozwój, na serwerze [thin] (http://code.macournoyer.com/thin/). –

Odpowiedz

5

to śmieci kolektor najpewniejszą MRI przesuwając pamięć. Zrobiłem kilka testów z app prostych szyn i częściowy:

100.times{Test.new} 

Widziałem kolce tak jak ty:

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) 

Korzystanie z mini-Profiler, to dość łatwo sprawdzić, ile razy GC został wywołany i, co ważniejsze, jak długo to trwało. Dla mnie te liczby idealnie pasowały. Jeśli było 10 skoków, było również 10 (+/- 1) wywołań GC, a także czasy działania GC były dokładnie różnicą między normalnymi renderingami i tymi, które trwały dłużej.

Aby użyć timera GC mini-profilera, dołącz do adresu URL ?pp=profile-gc-time. Jest też świetny post o tuning Ruby z mini-profilerem.