2013-04-03 10 views
5

Guardando l'output ruby mini-profiler ho notato questo pattern di rendering di 5-6 parti parziali a circa 6-7 ms ciascuna e quindi un rendering a 60-70 ms. Mi stavo chiedendo cosa avrebbe causato questo, sembra una sorta di rossore. Tutti i dati del modello vengono caricati all'avvio del rendering della vista, quindi so che non è causato dal caricamento lento.Il rendering di Rails partial ha tempo di rendering di 10x spikes

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 

Rubino 1.9.3p194, Rails 3.2.11

+1

* Potrebbe * essere il GC che si avvia. Anche se 60 ms sembra piuttosto lungo. –

+0

Vedo che tutto questo accade anche in fase di sviluppo. Mi piacerebbe sapere perché succede. – Swards

+0

dimenticato di menzionare: sviluppo, su server [thin] (http://code.macournoyer.com/thin/). –

risposta

5

Questo è garbage collector più certa di risonanza magnetica strisciando la memoria. Ho fatto alcuni test con una semplice applicazione Rails e un parziale di:

100.times{Test.new} 

ho potuto vedere i picchi come te:

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) 

Utilizzando mini-profiler, è abbastanza facile da controllare quante volte il È stato chiamato GC e, cosa più importante, per quanto tempo ha funzionato. Per me, questi numeri corrispondono perfettamente. Se c'erano 10 picchi, c'erano anche 10 (+/- 1) chiamate GC e anche i runtime del GC erano esattamente la differenza tra i normali rendering e quelli che richiedevano più tempo.

Per utilizzare il timer GC del mini-profiler, aggiungere ?pp=profile-gc-time al proprio URL. C'è anche un ottimo post su tuning Ruby con mini-profiler.

Problemi correlati