部分渲染和使用if语句哪个更快?

3
我有一个正在渲染的页面,根据查看它的人不同,它会略微有所不同。我的两个选择是1)使用一些ifs仅显示相关信息和2)从我的控制器中基于用户渲染两个不同的视图。
为了保持DRY,我不想只渲染两个完全不同的页面。相反,我更喜欢每个我渲染的页面都引用一些共同的部分。
例如:
选项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
当前用户视图.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

以下是结果: benchmarks 因此,似乎呈现部分非常缓慢。
想法?
Rails 4.1.5 ruby 2.1.2
编辑1:忘记在_if_clause.slim中添加| Hello行。

我理解你的担忧... 我曾经遇到过一个情况,需要渲染一个嵌套树 (acts_as_nested_tree)... 所有人,甚至文档都说我应该使用递归,一遍又一遍地渲染相同的局部视图.. 我讨厌这样。最终我在视图层编写了一个递归函数,并在其中完成了所有操作.. 更加高效... 渲染局部视图需要磁盘访问时间,无论是从应用程序树还是缓存中... 递归和编码可以在内存中完成所有操作,因此在处理大量重复时应该更快... - Ruby Racer
欢迎来到Stack Overflow。与其说“编辑1:”,不如自然地将更改融入问题中。如果问题被质疑,我们可以看到您对问题所做的更改,并通过融合它使您的问题更有意义。此外,与其提供一个显示文本的图像,不如将其复制/粘贴并格式化到您的问题中以便阅读。链接到外部网站/来源总是会失效和断裂,导致问题中出现间隙和无意义的部分。如果您想进行基准测试,请使用Ruby内置的Benchmark类或使用Fruity gem。我建议使用后者,因为它更容易使用。 - the Tin Man
@theTinMan 嘿,谢谢你的建议!我最初使用了 Ruby 的 Benchmark 类。这些数据来自 rack-mini-profiler gem,因为我想要获取页面加载时间。 - XML Slayer
1个回答

3
您的基准测试没有比较相同的功能。_render函数使用字符串渲染1000个局部视图,而_if_clause函数仅执行if条件比较。您应该比较例如在模板中处理内联通知和在局部视图中处理通知的模板渲染。
但是,即使局部视图渲染速度慢得多,另一个需要考虑的问题是,它是否重要?根据您的整体性能需求,如果代码更易于理解,则牺牲一些毫秒的视图时间可能是值得的。

1
很好的发现,但即使添加了这行代码(请参见我的编辑),时间也没有改变。在我看来,使用ifs实际上会更易读。 - XML Slayer
根据if检查的数量,仅仅做if检查可能会更容易。如果变得太复杂,你仍然可以重构并从中提取一些部分到partials中。 - Bruno E.
很可能会在8-12的范围内。我担心因为我的if语句需要访问数据库,所以速度会很慢,但我假设Rails会在第一次之后缓存结果? - XML Slayer
是的,Rails正在缓存activerecord查询,请参见http://guides.rubyonrails.org/caching_with_rails.html#sql-caching获取详细信息。 - Bruno E.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接