所以一周前,我开始将用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
当然,每次重新加载的时间都不同,但你仍然可以理解——在Rails3中,无论我使用Ruby 1.8.7还是1.9.2,这个视图的加载速度都慢10倍。我在开发和生产环境中以及在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 %>&title=<%= @picture.title.gsub("; "," ") %>&media=image&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 %>&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(/
/, <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>