heinous_inline_partial for story show perf

This commit is contained in:
Peter Bhat Harkins 2023-08-23 09:30:27 -05:00
parent 8dd88017a8
commit dacbbb86fa
3 changed files with 220 additions and 7 deletions

View File

@ -3,9 +3,10 @@ class ApplicationController < ActionController::Base
protect_from_forgery
before_action :authenticate_user
before_action :heinous_inline_partials, if: -> { Rails.env.development? }
before_action :mini_profiler
before_action :set_traffic_style
before_action :prepare_exception_notifier
before_action :set_traffic_style
# match this in your nginx config for bypassing the file cache
TAG_FILTER_COOKIE = :tag_filters
@ -72,6 +73,10 @@ class ApplicationController < ActionController::Base
)
end
def heinous_inline_partials
do_heinous_inline_partial_replacement
end
def mini_profiler
if @user && @user.is_admin?
Rack::MiniProfiler.authorize_request

View File

@ -56,12 +56,170 @@
<% end %>
<% previous_depth = comment.depth %>
<%= render "comments/comment", :comment => comment,
:show_story => (comment.story_id != @story.id),
:show_tree_lines => true,
:was_merged => (comment.story_id != @story.id),
:children => [],
:is_unread => is_unread?(comment) %>
<%
show_story = (comment.story_id != @story.id)
show_tree_lines = true
was_merged = (comment.story_id != @story.id)
is_unread = is_unread?(comment)
%>
<%#heinous_inline_partial(comments/_comment.html.erb)%>
<%# Do not edit, the content until /heinous_inline_partial comes from the named partial %>
<% flagged = comment.current_vote && comment.current_vote[:vote] == -1 %>
<input id="comment_folder_<%= comment.short_id %>"
class="comment_folder_button" type="checkbox"
<%= defined?(force_open) ||
@user.try(:is_moderator?) ||
(comment.score > Comment::COLLAPSE_SCORE && !flagged) ? "" : "checked" %>>
<div id="c_<%= comment.short_id %>"
data-shortid="<%= comment.short_id if comment.persisted? %>"
class="comment <%= comment.current_vote ? (comment.current_vote[:vote] == 1 ?
"upvoted" : "flagged") : "" %>
<%= comment.score < Comment::SCORE_RANGE_TO_HIDE.first ? "bad" : "" %>">
<% if defined?(show_tree_lines) && show_tree_lines %>
<label for="comment_folder_<%= comment.short_id %>"
class="comment_folder"></label>
<% end %>
<% if !comment.is_gone? %>
<% can_flag = @user && @user.can_flag?(comment) %>
<% score_display = comment.score_for_user(@user) %>
<div class="voters">
<% if @user %>
<a class="upvoter"></a>
<% else %>
<%= link_to "", login_path, :class => "upvoter" %>
<% end %>
<div class="score"><%= score_display %></div>
</div>
<div class="comment_parent_tree_line
<%= can_flag ? "can_flag" : "" %>
<%= score_display != "&nbsp;" ? "score_shown" : "" %>
<%= defined?(children) && children ? "" : "no_children" %>"></div>
<% end %>
<div class="details">
<div class="byline">
<a name="c_<%= comment.short_id %>"></a>
<% if defined?(show_tree_lines) && show_tree_lines %>
<label for="comment_folder_<%= comment.short_id %>"
class="comment_folder comment_folder_inline"></label>
<% else %>
<label for="comment_folder_<%= comment.short_id %>"
class="comment_folder comment_folder_inline force_inline"></label>
<% end %>
<% if defined?(was_merged) && was_merged %>
<span class="merge"></span>
<% end %>
<% if (@user && @user.show_avatars?) || !@user %>
<a href="/u/<%= comment.user.username %>"><%=
avatar_img(comment.user, 16) %></a>
<% end %>
<a href="/u/<%= comment.user.username %>"
class="<%= comment.html_class_for_user %>"><%=
comment.user.username %></a>
<% if comment.hat %>
<%= comment.hat.to_html_label %>
<% end %>
<% if comment.previewing %>
previewed
just now
<% else %>
<% if comment.has_been_edited? %>
edited
<% elsif comment.is_from_email? %>
e-mailed
<% end %>
<% is_unread ||= false %>
<%= time_ago_in_words_label(comment.has_been_edited? ? comment.updated_at : comment.created_at) %>
<%= raw "<span class='comment_unread'>(unread)</span>" if is_unread %>
<% end %>
<% if !comment.previewing %>
|
<a href="<%= comment.path %>">link</a>
<% if comment.is_editable_by_user?(@user) %>
|
<a tabindex="0" class="comment_editor">edit</a>
<% end %>
<% if comment.is_gone? && comment.is_undeletable_by_user?(@user) %>
|
<a tabindex="0" class="comment_undeletor" href="#c_<%= comment.short_id %>">undelete</a>
<% elsif !comment.is_gone? && comment.is_deletable_by_user?(@user) %>
|
<% if @user && @user.is_moderator? && @user.id != comment.user_id %>
<a tabindex="0" class="comment_moderator" href="#c_<%= comment.short_id %>">delete</a>
<% else %>
<a tabindex="0" class="comment_deletor" href="#c_<%= comment.short_id %>">delete</a>
<% end %>
<% elsif !comment.is_gone? && comment.is_disownable_by_user?(@user) %>
|
<a tabindex="0" class="comment-disowner" href="#">disown</a>
<% end %>
<% if can_flag && !flagged %>
<span class="dropdown_parent">
| <a class="flagger">flag</a>
</span>
<% elsif flagged %>
| <a class="flagger">unflag</a>
<% else %>
<span class="flagger flagger_stub"></span>
<% end %>
<% if @user && !comment.is_gone? && comment.story.accepting_comments? %>
|
<a tabindex="0" class="comment_replier" unselectable="on">reply</a>
<% end %>
<% if defined?(show_story) && show_story %>
| on:
<a href="<%= comment.story.comments_path %>"><%= comment.story.title %></a>
<% end %>
<span class="reason">
<% if comment.flags > 0 &&
comment.show_score_to_user?(@user) &&
(comment.user_id == @user.try(:id) || @user.try("is_moderator?")) %>
<% if (s = comment.vote_summary_for_user(@user).downcase).present? %>
| <%= s %>
<% end %>
<% elsif comment.current_vote && comment.current_vote[:vote] == -1 %>
| -1
<%= Vote::ALL_COMMENT_REASONS[comment.current_vote[:reason]].downcase %>
<% end %>
</span>
<% end %>
</div>
<div role="heading" aria-level="3" class="comment_text">
<% if comment.is_gone? %>
<p>
<span class="na">
[<%= comment.gone_text %><% if @user && @user.is_moderator? %> Visible to moderator:<% end %>]
</span>
</p>
<% if @user && @user.is_moderator? %>
<%= raw comment.markeddown_comment %>
<% end %>
<% else %>
<%= raw comment.markeddown_comment %>
<% end %>
</div>
</div>
</div>
<%#/heinous_inline_partial(comments/_comment.html.erb)%>
%>
%>
<%#
# If you edit this structure, update the incredibly brittle css selector

View File

@ -0,0 +1,50 @@
# Inlines partials into parent templates for performance.
# In production & test: once at startup; development: every request
#
# Inlining the comments/_comment partial into stories/show (bulk of our traffic!)
# gives a 25% speedup over 'render collection: @comment'.
HEINOUS_INLINE_PARTIALS = {
# including template => partial
}
Dir['app/views/**/*.erb'].each do |filename|
template = File.read(filename)
next unless template.include? 'heinous_inline_partial'
partial_match = template.match(/^<%#heinous_inline_partial\(([\w\/\.]+)\)%>/)
partial_name = partial_match && partial_match.captures.first
HEINOUS_INLINE_PARTIALS[filename] = 'app/views/' + partial_name
end
l = Logger.new(STDOUT)
l.warn "heinous_inline_partial initialized, found: #{HEINOUS_INLINE_PARTIALS}"
def do_heinous_inline_partial_replacement
HEINOUS_INLINE_PARTIALS.each do |filename, partial_name|
partial_mtime = File.mtime(partial_name)
# puts "heinous contemplating #{filename} #{File.mtime(filename).to_i} #{partial_mtime.to_i}"
next if File.mtime(filename) == partial_mtime
# puts " will replace in #{filename}"
template = File.read(filename)
template.sub!(/^<%#heinous_inline_partial\(([\w\/\.]+)\)%>(.+)^<%#\/heinous_inline_partial\(([\w\/\.]+)\)/m) { |match|
raise "Template name didn't match in open and closing tags. One per file!" unless $1 == $3
# puts " .sub! matched, replacing"
<<~REPLACE
<%#heinous_inline_partial(#{$1})%>
<%# Do not edit, the content until /heinous_inline_partial comes from the named partial %>
#{File.read(partial_name)}
<%#/heinous_inline_partial(#{$1})%>
REPLACE
}
# puts " writing filename #{filename}"
File.write(filename, template)
File.utime(partial_mtime, partial_mtime, filename)
end
end
# run once at startup:
do_heinous_inline_partial_replacement
# see before_action in ApplicationController for development mode hook