Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rake assets:precompile taking extremely long to complete

In my dev sandbox

RAILS_ENV=production rake assets:precompile

is taking over 4 minutes to complete. Is this normal. On heroku it is taking over 10 minutes to do the job and sometimes is timing out. Is there any way to disect this and/or speed it up?

UPDATE

I profiled the CSS vs JS phases of compilation

3.7 s        js
175 s            css

The numbers were made by instrumenting here

----------------------
/Users/bradphelan/.rvm/gems/ruby-1.9.2-p180@gobbq/gems/sprockets-2.1.2/lib/sprockets/processing.rb
----------------------
266     # Assign a compressor to run on `application/javascript` assets.
267     #
268     # The compressor object must respond to `compress` or `compile`.
269     def js_compressor=(compressor)
270       expire_index!
271  
272       unregister_bundle_processor 'application/javascript', :js_compressor
273       return unless compressor
274  
275       register_bundle_processor 'application/javascript', :js_compressor do |context, data|
276  
277         timeit "js" do
278           compressor.compress(data)
279         end
280  
281       end
282     end

and

    ----------------------
    /Users/bradphelan/.rvm/gems/ruby-1.9.2-p180@gobbq/gems/sprockets-2.1.2/lib/sprockets/processing.rb
    ----------------------
    241  
    242     # Assign a compressor to run on `text/css` assets.
    243     #
    244     # The compressor object must respond to `compress` or `compile`.
    245     def css_compressor=(compressor)
    246       expire_index!
    247  
    248       unregister_bundle_processor 'text/css', :css_compressor
    249       return unless compressor
    250  
    251       register_bundle_processor 'text/css', :css_compressor do |context, data|
    252         timeit "css" do
    253           compressor.compress(data)
    254         end
    255       end
    256     end

The timeit call is the added bit doing the timing

def timeit context
  s = Time.now
  yield.tap do 
    e = Time.now
    d = e - s
    puts "#{d*1000}\t #{context}"
  end
end
like image 289
bradgonesurfing Avatar asked Mar 16 '12 15:03

bradgonesurfing


People also ask

What does rake assets Precompile do?

rake assets:precompile. We use rake assets:precompile to precompile our assets before pushing code to production. This command precompiles assets and places them under the public/assets directory in our Rails application.


2 Answers

The hackety hack solution seems to be to monkey patch the standard sass compression engine out of the way. I added this to the top of my application.rb

module Sass
  module Rails
    class CssCompressor
      def compress(css)
        css
      end
    end
  end
end

The difference in file size was 124k before the monkey patch and 125k after and an order of magnitude speed improvement.

like image 41
bradgonesurfing Avatar answered Oct 16 '22 12:10

bradgonesurfing


I am on Rails 3.2.13 - I had the same problem with css compression taking an extremely long time. To fix:

In Gemfile add:

gem 'yui-compressor'

In config/environments/production.rb:

config.assets.css_compressor = :yui
config.assets.js_compressor = :yui

rake assets:precompile without those changes: 325 seconds

rake assets:precompile with those changes: 79 seconds

rake assets:precompile with no compression: 45 seconds

like image 159
Yoni Baciu Avatar answered Oct 16 '22 13:10

Yoni Baciu