2013-04-03 12 views
5

Looking ruby mini-profiler Ausgabe Ich bemerkte dieses Muster von 5-6 Teilwiedergabe bei etwa 6-7 ms jeweils und dann eine Wiedergabe bei einer Aus 60-70 ms. Ich habe mich gefragt, was das verursachen würde, es sieht aus wie eine Art von Spülung. Alle Modelldaten werden geladen, wenn das Rendering der Ansicht gestartet wird. Ich weiß also, dass dies nicht durch das verzögerte Laden verursacht wird.Rails Partial Rendering hat 10x Spikes Renderzeit

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 

Rubin 1.9.3p194, Rails 3.2.11

+1

* Könnte * sein der GC tritt in. Obwohl 60ms scheint ziemlich lang. –

+0

Ich sehe das auch die ganze Zeit in der Entwicklung. Ich würde gerne wissen, warum es passiert. – Swards

+0

vergessen zu erwähnen: Entwicklung, auf [dünn] (http://code.macournoyer.com/thin/) Server. –

Antwort

5

Dies wird am bestimmten MRI Garbage Collector den Speicher klauen. Ich habe einige Tests mit einem einfachen Rails-Anwendung und einem Teil:

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) 

Mit Mini-Profiler, ist es ziemlich einfach zu überprüfen, wie oft:

100.times{Test.new} 

ich die Spikes wie Sie sehen können GC wurde angerufen und, noch wichtiger, wie lange es lief. Für mich sind diese Zahlen perfekt abgestimmt. Wenn es 10 Spikes gab, gab es auch 10 (+/- 1) GC-Aufrufe und auch die Laufzeiten des GC waren genau die Differenz zwischen den normalen Renderings und denen, die länger brauchten.

Um den GC-Timer des Mini-Profilers zu verwenden, fügen Sie ?pp=profile-gc-time an Ihre URL an. Es gibt auch einen tollen Post über tuning Ruby mit Mini-Profiler.