Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RubyChina 2012 - Ten slow things you don't know

RubyChina 2012 - Ten slow things you don't know

RubyChina 2012

Yi-Ting Cheng

November 18, 2012
Tweet

More Decks by Yi-Ting Cheng

Other Decks in Technology

Transcript

  1. Me • http://blog.xdite.net • Rails Developer ( 2007~ ) •

    ROCO Inc. Founder • Facebook World Hack 世界⾸首獎 12年11月18⽇日星期⽇日
  2. We follow • Convention over configuration • Best Practices •

    Default • Instinct!!! 12年11月18⽇日星期⽇日
  3. 抓不到的地⽅方 • Deployment • Asset Compiling • Loading Environment •

    ActiveRecord (MySQL) convention • View 12年11月18⽇日星期⽇日
  4. Bundler desc "Run bundle install" task :install_bundle_gems do run "cd

    #{deploy_to}/current; RAILS_ENV=#{rails_env} bundle install" end Wrong & Slow 12年11月18⽇日星期⽇日
  5. Deploy with Asset precompile set :assets_dependencies, %w(app/assets lib/assets vendor/assets Gemfile.lock

    config/routes.rb) namespace :deploy do namespace :assets do desc <<-DESC Run the asset precompilation rake task. You can specify the full path \ to the rake executable by setting the rake variable. You can also \ specify additional environment variables to pass to rake via the \ asset_env variable. The defaults are: set :rake, "rake" set :rails_env, "production" set :asset_env, "RAILS_GROUPS=assets" set :assets_dependencies, fetch(:assets_dependencies) + %w(config/locales/js) DESC task :precompile, :roles => :web, :except => { :no_release => true } do from = source.next_revision(current_revision) if capture("cd #{latest_release} && #{source.local.log(from)} #{assets_dependencies.join ' '} | wc -l").to_i > 0 run %Q{cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile} else logger.info "Skipping asset pre-compilation because there were no asset changes" end end end end Solution 12年11月18⽇日星期⽇日
  6. Asset Pipeline(require_tree) # posts.js.coffee # Place all the behaviors and

    hooks related to the matching controller here. # All this logic will automatically be available in application.js. # You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ empty_assets still cost compile time ~250ms Wrong & Slow 12年11月18⽇日星期⽇日
  7. Asset Pipeline(@import) • import “compass” • @import "compass/utilities"; • @import

    "utilities/color"; • @import "utilities/general"; • @import "utilities/sprites"; • @import "utilities/tables"; • @import "compass/typography"; • @import "compass/css3"; recursive @import Slow 12年11月18⽇日星期⽇日
  8. Bundler Group matters • import all gems without grouping gem

    "capistrano" gem "capistrano-ext" gem "cape" gem "magic_encoding" gem "annotate" gem “rspec” gem “capybara” Wrong & Slow 12年11月18⽇日星期⽇日
  9. Bundler Group matters • group by environment group :development do

    gem "capistrano" gem "capistrano-ext" gem "cape" gem "magic_encoding" gem "annotate" end group :test do gem “rspec” gem “capybara” end Solution 12年11月18⽇日星期⽇日
  10. Order by String • state machine • published • draft

    • rejected 12年11月18⽇日星期⽇日
  11. Order by String add_column :posts,: current_state, :string , :limit =>

    11 Solution Optimal index size for variable text in MySQL http://www.xarg.org/2012/07/optimal-index-size- for-variable-text-in-mysql/ 12年11月18⽇日星期⽇日
  12. map(&:id) <%= posts.map(&:id) %> ( SELECT * from `posts` )

    [1,3,5,8,13,21] Wrong & Slow 12年11月18⽇日星期⽇日
  13. map(&:id) <%= posts.select(:id).map(&:id) %> ( SELECT id from `posts` )

    [1,3,5,8,13,21] Solution 12年11月18⽇日星期⽇日
  14. timestamp create_table :invoices do |t| t.integer :user_id t.datetime :paid_at t.timestamps

    end scope :recent_paid, order(“paid_at DESC”) Default & Slow Slow Slow 12年11月18⽇日星期⽇日
  15. Logic in View • ERB with eval <% if current_user.is_admin?

    %> admin panel <% else %> user panel <% end %> Wrong & Slow 12年11月18⽇日星期⽇日
  16. Query in View/Helper • Query in view doesn’t have cache

    <%= post.user.name %> Wrong & Slow 12年11月18⽇日星期⽇日
  17. Query in View/Helper class Post < ActiveRecord::Base def author_name user.try(:name)

    end end Solution <%= post.author_name %> 12年11月18⽇日星期⽇日
  18. for each <% for post in @posts %> <div class=”posts”

    id=”<%= @post.id %>”> <%= post.user_name %> </div> <% end %> Wrong & Slow 12年11月18⽇日星期⽇日
  19. for each <%= div_for(@posts, :class => “posts”) do |post| %>

    <%= post.user_name %> <% end %> Solution 12年11月18⽇日星期⽇日
  20. complex link_to <% if current_user %> <a href=”/users/<%= current_user.id %>”>

    <i class=”icon icon-user”> </a> <span> <%= current_user.name %> </span> </a> <% end %> Wrong & Slow 12年11月18⽇日星期⽇日
  21. complex link_to <%= link_to_if(current_user, user_path(current_user) ) do content_tag(:i, :class =>

    “icon icon-user”) + content_tag(:span, current_user. name) end %> Solution 12年11月18⽇日星期⽇日