【发布时间】:2017-11-14 13:10:41
【问题描述】:
我不确定这是否是 Rails 特有的问题,因此我也将其标记为 ruby。
我正在通过部分呈现event 记录的集合。但是,我发现渲染部分不同会导致性能差异很大。
两个版本使用完全相同的数据,唯一改变的是用于渲染部分的代码。
为什么一个版本总是比另一个版本快 4 倍?让我想知道我正在接受哪些其他性能打击......
慢版本(950ms 总请求时间):
<% 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)
...
更快的版本(250ms 总请求时间):
<%= render partial: "events/event", collection: events, as: :event %>
# Log output
Rendered events/_event.html.erb (58.7ms)
【问题讨论】:
-
当你渲染一个部分时,它首先编译 html。第一次发生
events.length次,第二次只发生一次。这种情况(循环变慢)也发生在 Rails 的其他地方,例如 DB 查询。它被称为“N+1”
标签: ruby performance ruby-on-rails-4 partials