2017-06-12 1 views
3

Je ne suis pas sûr si c'est un problème spécifique à Rails, d'où la raison pour laquelle je l'ai également marqué ruby.Rails 4: pourquoi une façon de rendre les partiels tellement plus rapides?

Je rends une collection de event enregistrements via un partiel. Cependant, j'ai trouvé que rendre le partiel résulte différemment en différences de performance drastiques.

Les deux versions utilisent exactement les mêmes données, la seule chose qui change est le code utilisé pour rendre les partiels.

Pourquoi diable une version est-elle toujours plus rapide que l'autre? Ca me donne me demande ce que d'autres problèmes de performances que je prends ...

version lente (950ms temps de demande totale):

<% events.each do |event| %> 
    <%= render partial: "events/event", locals: { event: event } %> 
<% end %> 

# Log output 
Rendered events/_event.html.erb (1.1ms) 
Rendered events/_event.html.erb (1.1ms) 
... 

version plus rapide (250 ms de temps de demande totale):

<%= render partial: "events/event", collection: events, as: :event %> 

# Log output 
Rendered events/_event.html.erb (58.7ms) 
+0

lorsque vous rendez un partiel, il compile le code HTML en premier. Dans le premier cela arrive 'events.length' fois, dans la seconde il arrive une seule fois. Cette situation (les boucles étant plus lentes) se produit également dans d'autres emplacements dans Rails, tels que les requêtes DB. C'est ce qu'on appelle "N + 1" –

Répondre

3

exemple 1: vous êtes en train de rendre une partie x fois (en fonction des événements). ce qui signifie que vous compilez html x fois (une fois à chaque fois que la boucle s'exécute). ce qui est lent

exemple 2: vous rendre un partiel avec une collection d'événements le code HTML est compilé une fois (car il n'y en a qu'une partielle). qui est rapide