【问题标题】:Which is faster? Rendering partials or using if-statements?哪个更快?渲染部分或使用 if 语句?
【发布时间】:2015-10-26 00:43:49
【问题描述】:

我有一个正在渲染的页面,根据查看者的不同,它看起来会略有不同。我的两个选项是 1) 使用一些 ifs 仅显示相关信息和 2) 根据用户是谁从我的控制器呈现两个不同的视图。

为了保持干燥,我不想只渲染两个完全独立的页面。相反,我希望我呈现的每个页面都引用一些常见的部分。

例如:

选项 1

view.slim

h1 Notifications
- if current_user.student.id == params[:id]
  = link_to 'Edit', ...
- @notifications.each do |note|
  # some stuff
h1 Activity
- if current_user.student.id == params[:id]
  = link_to 'Edit', ...
- @activities.each do |note|
  # some stuff
#etc...

选项 2

current_user_view.slim

= render 'notifications_header
= link_to 'Edit', ...
= render 'notifications'

= render 'activities_header
= link_to 'Edit', ...
= render 'activities'

other_user_view.slim

= render 'notifications_header
= render 'notifications'

= render 'activities_header
= render 'activities'

_notifications.slim

- @notifications.each do |note|
  # some stuff

哪种方法更有效?

基准测试

以下是我对以下各项进行的一些基准测试:

_render.slim

- 1000.times do
  = render 'foo'

_foo.slim

| Hello

_if_clause.slim

- 1000.times do
  - if current_user.student.id == params[:id]
    | Hello

结果如下:

所以看起来渲染局部非常慢。

想法?

导轨 4.1.5 红宝石 2.1.2

编辑 1:忘记在 _if_clause.slim 中添加 | Hello

【问题讨论】:

  • 我同意你的担忧......我有一个案例需要渲染嵌套树(acts_as_nested_tree)......每个人,甚至是文档,都表示我应该使用递归,渲染相同的部分一次又一次..我讨厌它。我最终在视图级别编写了一个递归函数,并在那里做所有事情......效率更高......从应用程序树或缓存呈现部分所需的磁盘访问时间......递归和编码在内存中完成所有事情,所以它应该更快,尤其是在处理大规模重复时......
  • 欢迎来到 Stack Overflow。与其说“编辑 1:”,不如将变化自然地融入问题中。如果每个问题都受到质疑,我们可以看到您在哪里更改了问题,并且通过混合它,您的问题将更有意义。此外,与其提供图像来向我们展示文本,不如简单地复制/粘贴并在您的问题中格式化以提高可读性。指向外部站点/来源的链接总是会腐烂和中断,从而在问题中留下空白和无意义的部分。如果您想进行基准测试,请使用 Ruby 的内置 Benchmark 类或使用 Fruity gem。我推荐后者,因为它更容易使用。
  • @theTinMan 嘿,感谢您的提示!我最初使用 Ruby 的 Benchmark 类。此数据来自rack-mini-profiler gem,因为我也想实际获取页面加载时间。

标签: ruby-on-rails ruby if-statement partial-views benchmarking


【解决方案1】:

您的基准测试没有比较相同的功能。 _render 使用字符串渲染 1000 个部分,_if_clause 仅执行 if-comparisons。你应该比较例如带有内联通知处理的模板呈现和部分执行通知处理的模板。

但即使部分渲染应该慢得多,另一件要考虑的事情是,这有关系吗?根据您的整体性能需求,如果代码更易于理解,则可能值得牺牲几毫秒的查看时间。

【讨论】:

  • 很好,但即使在其中添加该行(请参阅我的编辑)也没有改变时间。在我看来,使用ifs 实际上会更易读。
  • 根据 if-checks 的数量,只做 if-check 可能更容易。如果它变得太复杂,您仍然可以重构并将一些部分提取为部分。
  • 它最有可能在 8-12 范围内。我担心因为我的 if 必须访问数据库,它会很慢,但我假设 Rails 在第一次之后缓存结果?
  • 是的,Rails 正在缓存 activerecord 查询,详情请参阅guides.rubyonrails.org/caching_with_rails.html#sql-caching
猜你喜欢
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 2011-06-10
  • 1970-01-01
  • 2023-03-26
  • 2011-08-11
  • 2012-11-03
相关资源
最近更新 更多