ruby-on-rails - Rails3 - 为什么我的 View 加载时间这么长?

标签 ruby-on-rails ruby performance ruby-on-rails-3 lazy-loading

所以一周前,我开始将用 Rails 2.3.5 编写的旧应用程序迁移到新的 3.0。不幸的是,我发现某些 View 的加载速度出奇地慢。

例子:

Rails 2.3.5 Ruby 1.8.7 -> WEBrick: Completed in 297ms (View: 143, DB: 40)
Rails 3.0.0 Ruby 1.8.7 -> WEBrick: Completed in 3081ms (View: 261, ActiveRecord: 108)
Rails 3.0.0 Ruby 1.8.7 -> WEBrick: Completed in 2495ms (View: 356, ActiveRecord: 76), slightly improved version -> less SQL queries, more counting in the view
Rails 3.0.0 Ruby 1.9.2 -> WEBrick: Completed in 2941ms (View: 423, ActiveRecord: 90), imp. version

当然,每次重新加载的时间都不同,但您仍然可以理解 - 在 Rails 3 中,此 View 加载速度慢 10 倍,无论我使用 Ruby 1.8.7 还是 1.9.2。我在开发和生产环境以及 Heroku 上检查过——每次看起来都一样。其他 View 的加载时间在 3.0 中大约慢 2 倍。

在这里你可以找到所有的日志:

http://img811.imageshack.us/img811/8514/1rails235ruby187oldver.jpg

http://img217.imageshack.us/img217/5521/2rails300ruby187oldver.jpg

http://img7.imageshack.us/img7/3089/3rails300ruby187diffver.jpg

http://img534.imageshack.us/img534/5138/4rails300ruby192diffver.jpg

这是怎么回事?我忙了 1 周来调整我所有的 Controller 、 View 、gem、插件和配置以适应 Rails3,现在我被卡住了......我觉得我真的应该学习一些 PHP,因为它会让我更好地控制实际是什么正在发生。

View 在这里:

    <%= render :partial => 'menu' %>

<div id="preload">
    <%= image_tag("/images/next_big.png") %>
</div>  

    <div class="clearer"><hr /></div>

    <div class="picture">
        <%= link_to image_tag(@picture.img.url(:page), :alt => @picture.title.gsub("; "," "), :border => 0), :action => "fullsize", :link => @picture.link %>
    </div>

    <div class="right">
        <div class="title"><%= raw @picture.title.gsub("; ","<br />") %></div>
        <div class="tags">
            <% taglist = @picture.cached_tag_list.split(", ") %>
            <% x = taglist.length %>
            <% y = 0 %>
            <% x.times do %>
                <a href = "/tag/<%= taglist[y].gsub(" ", "_") %>"><%= taglist[y] %></a><% y += 1 %><% if y != x %>,<% end %>
            <% end %>           
        </div>
        <div class="datetime">Posted <%= time_ago_in_words(@picture.created_at) %> ago</div>
        <% this_voting = "voting" %>
        <div id="<%= this_voting %>" class="voting">
            <%= link_to image_tag("/images/yes.png", :alt => "Vote up", :class => 'vote_button'), {:action => :yes_vote, :id => @picture.id}, :remote => true %> 
            <span id="<%= this_voting + '_result' %>"><%= @picture.voting %></span> 
            <%= link_to image_tag("/images/no.png", :alt => "Vote against", :class => 'vote_button'), {:action => :no_vote, :id => @picture.id}, :remote => true %> 
            Pageviews: <%= @picture.views %>    
        </div>
        <div class="link">Link:<br /><input type="text" value="http://bzzzzzzzzzzz.com/<%= @picture.link %>" /></div>
        <div class="share">Share:<br />
            <a href="http://facebook.com/sharer.php?u=http://bzzzzzzzzzzz.com/<%= @picture.link %>" target="_blank">
                <img src="/images/mfb.png" alt="Facebook" onmouseover="puttext(fb, 0)" onmouseout="cleartext(0)" border="0" /></a>
            <a href="http://twitter.com/home?status=http://bzzzzzzzzzzz.com/<%= @picture.link %>" target="_blank">
                <img src="/images/mtwitter.png" alt="Twitter" onmouseover="puttext(twitter, 0)" onmouseout="cleartext(0)" border="0" /></a>
            <a href="http://digg.com/submit?url=http://bzzzzzzzzzzz.com/<%= @picture.link %>&amp;title=<%= @picture.title.gsub("; "," ") %>&amp;media=image&amp;topic=comedy" target="_blank">
                <img src="/images/mdigg.png" alt="Digg" onmouseover="puttext(digg, 0)" onmouseout="cleartext(0)" border="0" /></a>
            <a href="http://reddit.com/submit?url=http://bzzzzzzzzzzz.com/<%= @picture.link %>&amp;title=<%= @picture.title.gsub("; "," ") %>" target="_blank">
                <img src="/images/mreddit.png" alt="Reddit" onmouseover="puttext(reddit, 0)" onmouseout="cleartext(0)" border="0" /></a>
            <a href="http://stumbleupon.com/submit?url=http://bzzzzzzzzzzz.com/<%= @picture.link %>" target="_blank">
                <img src="/images/msu.png" alt="StumbleUpon" onmouseover="puttext(su, 0)" onmouseout="cleartext(0)" border="0" /></a>
        </div>
            <div id="share_caption0" class="share_caption"></div>
            <div class="small_clearer"></div>
        <% if @picture.last_comment_body %>
        <div class="links_to_c">
            <a href="#comments"><%= @picture.comments_count %> comment<% if @picture.comments_count > 1 %>s<% end %></a> 
            | <%= link_to "Write a comment", :anchor => "add_comment" %>
        </div>
        <% else %>
        <div class="links_to_c">
            <%= link_to "No comments, write a comment", :anchor => "add_comment" %>
        </div>
        <% end %>
        <% if @picture.fullsize == true %>
            <div class="fullsize">
                <%= link_to "Fullsize", :action => "fullsize", :link => @picture.link %>
            </div>
        <% end %>       
    </div>
    <div class="next">
    <% if @picture.id != 1 %>
        <% next_pict_link = Picture.find(@picture.id.to_i - 1).link %>
        <%= link_to image_tag("/images/next.png", :alt => 'Next picture', :border=>0, :onmouseover => "this.src='/images/next_big.png'", :onmouseout => "this.src='/images/next.png'"), :action => 'show', :link => next_pict_link %>
    <% else %>
        <% last_pict_link = Picture.find(:last).link %>
        <%= link_to image_tag("/images/next.png", :alt => 'Latest picture', :border=>0, :onmouseover => "this.src='/images/next_big.png'", :onmouseout => "this.src='/images/next.png'"), :action => 'show', :link => last_pict_link %>
    <% end %>
    </div>

    <div class="clearer" style="padding-bottom: 0px"><hr /></div>
    <h1><%= @thumbnails_text %></h1>
    <% @pictures.each do |pict| %>
        <%= link_to image_tag(pict.img.url(:thumb), :alt => "", :border => 1, :class => 'thumbnail'), :action => "show", :link => pict.link %>
    <% end %>   
    <div class="clearer" style="padding-top: 6px; padding-bottom: 15px"><hr /></div>
        <% if @picture.last_comment_body != nil %>
            <a name="comments"><h1>Comments:</h1></a>
            <% @picture.comments.each do |comment| %>
            <div id="<%= comment.id %>" class="comment">
                <font class="c_author"><%= comment.author %></font>
                <font class="c_datetime"><%= time_ago_in_words(comment.created_at) %> ago</font>
                <font class="c_id">#<%= comment.id %></font><br />
                <div class="c_body"><%= comment.body.gsub(/\n/, '<br />') %></div>
             </div>
            <% end %>
        <% end %>       
    <div id="insert_here"></div>
    <a name="add_comment"></a>
    <%= form_for [@picture, Comment.new], :remote => true do |f| %>
    <div id="add_comment" <% if @picture.last_comment_body == nil %>style="margin-top: 15px"<% end %>>
        <div class="f_section">
            <div class="f_type" style="padding-right: 46px"><%= f.label :author, "Nick:" %></div>
            <div class="f_field"><%= f.text_field :author, :maxlength => 40 %></div>
        </div>
        <div class="f_section">
            <div class="f_type"><%= f.label :body, "Comment:" %></div>
            <div class="f_field"><%= f.text_area :body, :maxlength => 2000, :rows => 6 %></div>
        </div>
        <div class="f_section">
            <div class="f_type" style="padding-right: 20px"><%= f.label :captcha, "Captcha:" %></div>
            <div class="f_captcha"><%= raw recaptcha_tags %></div>
        </div>
        <div class="f_submit">
            <%= f.submit "Submit", :class => 'submit' %>
        </div>
    </div>
    <% end %>
<div class="clearer bottom_clearer fifty_from_top"><hr /></div>

最佳答案

在任何环境中都有很多可能出错的地方,尤其是 PHP。

此处的问题可能是将 WEBrick 与 Rails 3 结合使用。使用诸如 mongrel 或 Passenger 之类的替代方案可以帮助缩小此问题的范围。

您可能会遇到本应正常工作的事情超时的情况,例如,未正确配置 Memcache,或者正在发出最终失败的 CURL 请求。

拥有一个没有任何内容的非常基本的 View 总是很方便,您可以使用它来对应用程序的基准性能进行基准测试。一个只有一个 Action 和一个空 View 的简单 Controller 就可以解决这个问题。诊断问题是将您的一些 Controller 代码添加到此空操作,直到您可以触发问题,或者从您的 View 中剥离部分以查看是否是导致问题的原因。

我通常会开始注释部分内容以查看是否其中之一导致了拖拽,然后从那里回到 Controller 以密切注意正在加载的内容。

关于ruby-on-rails - Rails3 - 为什么我的 View 加载时间这么长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4035735/

相关文章:

ruby-on-rails - 如何让 View 更简单, Controller 更有用?

ruby-on-rails - 如何创建一个规范来验证 Pundit 拒绝未登录的用户?

android - 确定android CPU速度?

mysql - 关于本指标的建议和改进

ruby-on-rails - "The Ruby way"(mixins 和类重新打开)与依赖注入(inject)

ruby-on-rails - 使用 Rails.cache.write 设置原始值

ruby-on-rails - 如果记录存在,Rails 如何改进?

ruby - Shopify Liquid 语法 - {%- assign [some_var] = [some_val] -%} 和 {% assign [some_var] = [some_val] %} 有什么区别

ruby - ruby docker 图像中的过期 ca 证书(2.6.8-bullseye)

ruby-on-rails - rails 测试和开发数据库处于不同的模式中