【发布时间】:2012-04-02 03:17:23
【问题描述】:
在我的开发沙箱中
RAILS_ENV=production rake assets:precompile
需要 4 多分钟才能完成。这正常吗。在 heroku 上,完成这项工作需要 10 多分钟,有时会超时。有什么办法可以剖析和/或加快速度吗?
更新
我分析了编译的 CSS 与 JS 阶段
3.7 s js
175 s css
这些数字是通过在这里检测得到的
----------------------
/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
和
----------------------
/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
timeit 调用是进行计时的附加位
def timeit context
s = Time.now
yield.tap do
e = Time.now
d = e - s
puts "#{d*1000}\t #{context}"
end
end
【问题讨论】:
-
以下是我在提高性能方面发现的一些事情……并不是真正的答案;更像是一些指针:[1]:stackoverflow.com/questions/9546831/… [2]:stackoverflow.com/questions/8568786/… [3]:ruby-forum.com/topic/2538285
-
实际上其中一个链接看起来很可能。我怀疑 Rails 应用程序以某种方式被多次加载。 ruby-forum.com/topic/2538285#1026719
-
哦,太好了...我担心我的回答会过于宽泛以至于令人讨厌。
-
设置 config.assets.compress = false 将我的开发机器上的编译时间降低到 40 秒。所以javascript压缩需要3分20秒。我们这里没有编译 boost C++ 库!!
-
我认为这不是答案。我的意思是我仍然想要压缩。花费这么长时间需要修复而不是关闭该功能。
标签: performance ruby-on-rails-3.1 asset-pipeline precompile