Rails3 - 为什么我的加载时间太长了?

时间:2010-10-27 17:04:46

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

所以一周前我开始将我用Rails 2.3.5编写的旧应用程序移动到新的3.0。不幸的是,我发现有些观点的加载速度非常慢。

示例:

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中,这个视图加载速度要慢10倍,无论我使用的是Ruby 1.8.7还是1.9.2。我在开发和生产环境以及Heroku上检查过 - 每次看起来都一样。其他视图的加载时间在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

这里有什么问题?我忙了一个星期来调整我的所有控制器,视图,宝石,插件和配置到Rails3,现在我卡住了...我觉得我真的应该学习一些PHP,因为它会让我更多地控制实际上是什么发生。

观点如下:

    <%= 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>

2 个答案:

答案 0 :(得分:1)

在任何环境中都会出现很多问题,尤其是PHP。

这里可能存在的问题是使用WEBrick和Rails 3.使用像mongrel或Passenger这样的替代方案可以帮助缩小这个问题。

你可能会遇到一些应该工作的事情是超时的情况,例如,没有正确配置Memcache,或者正在进行最终失败的CURL请求。

拥有一个非常基本的视图总是很方便,你可以使用它来对应用程序的基准性能进行基准测试。一个简单的控制器具有单个动作和一个空视图可以在这里做到这一点。诊断问题的方法是将一些控制器代码添加到此空操作中,直到您可以触发问题,或从视图中删除部分以查看是否是导致它的原因。

我通常开始评论部分内容以查看其中一个是否导致拖拽,然后从那里移回控制器以密切关注正在加载的内容。

答案 1 :(得分:1)

所以..我想我已经找到了问题所在。我看到WEBrick给了我两个弃用警告(与RAILS_ROOT和RAILS_ENV相关)。我自己没有使用任何这些短语,所以我开始在我的插件和宝石中寻找它们。我发现它们被回形针(2.3.4)和recaptcha gem(由ambethia 0.2.3重新回收)所使用。然后我从我的Gemfile中删除了回形针,并从我的模型中评论了所有回形针相关的设置。加载时间降至400-500ms。

所以我想我需要等到有人会修理回形针...我是一个红宝石新手,所以我不能自己做这个:/