【问题标题】:Rails 4: why is one way of rendering partials so much faster?Rails 4:为什么一种渲染局部的方法要快得多?
【发布时间】: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


【解决方案1】:

示例 1: 您正在渲染部分 x 次(取决于事件)。 这意味着您正在编译 html x 次(每次循环运行一次)。这很慢

示例 2: 您正在使用一组事件渲染一个部分 html 编译一次(因为只有一个部分)。速度很快

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2013-06-20
    • 1970-01-01
    相关资源
    最近更新 更多