2011-12-17 37 views
8

cào - các thùng rác mất khoảng 18 giây để chạy. Đây mới chỉ là thời gian cần để tải tất cả các nhiệm vụ, kết quả là bất kỳ công việc tôi xác định sẽ mất ít nhất khoảng thời gian này để chạy:Làm cách nào để tăng tốc tác vụ Ruby/Rake

$time rake --tasks 
rake db:clean   # Cleaning up database 
rake passenger:restart # Restart Application 
rake spec    # Run specs 

real 0m18.816s 
user 0m7.306s 
sys 0m5.665s 

My Rakefile:

$: << "." 
require "rubygems" 
require "rspec/core/rake_task" 

desc "Run those specs" 
task :spec do 
    RSpec::Core::RakeTask.new(:spec) do |t| 
    t.rspec_opts = %w{--colour --format progress} 
    t.pattern = 'spec/*_spec.rb' 
    end 
end 

task :default => :spec 

Bất kỳ ý tưởng tại sao rake mất nhiều lần? Cảm ơn

+0

Điều đó có xảy ra với Rakefile trống không? Bạn có thể cho bạn thấy không? –

+0

Mykekeile chỉ chứa tác vụ rpec như bạn thấy trong bài viết của tôi – Laughingman

+0

Bạn có chắc là bạn có đúng Rakefile không? 'rake -T' đang hiển thị tác vụ Khởi động lại hành khách không được xác định (hoặc bao gồm) trong Rakefile của bạn. –

Trả lời

0

Toàn bộ môi trường đường ray phải được tải, do đó, ngay cả các tác vụ cào đơn giản như rake --tasks cũng mất một khoảng thời gian. Mở bảng điều khiển với rails console hoặc script/console sẽ mất thời gian tương tự. Bạn có thể thử hack Ruby hoặc Rails to speed up rake, nhưng tối ưu hóa quá nhiều có thể xấu nếu bạn muốn chuyển sang phiên bản mới hơn sau này. Vì môi trường đường ray phải được tải, cleaning up routes cũng có thể hữu ích.

4

Hãy thử spring

dòng lệnh sẽ trông giống như:

spring rake -T 

Nó sẽ mất nhiều thời gian hơn chạy lần đầu tiên, nhưng chạy tiếp theo sẽ rất nhanh.

3

Giải pháp này phù hợp với tôi: Faster rake tasks in Rails.

Tôi phải thực hiện một chút thay đổi khi tạo thư mục lib/tasks/no_rails và đặt tất cả các tệp Rake không cần Rails vào đó và chỉ tải những tệp bằng cách sử dụng phương thức trên.

1

Tôi thích giải pháp Pratik đề cập đến trường hợp chung của tải đường ray cho các công việc cần đến nó và không cho những người không làm, cho bất kỳ công việc cào nào mà không cần phải nhớ trước.

Một phương pháp ít xâm lấn để chạy tác vụ cào không cần đường ray là sử dụng tùy chọn rake -f để báo cho rake sử dụng một Rakefile cụ thể. Bằng cách này, cào sẽ không đi tìm kiếm các nhiệm vụ cào trong tất cả các đường ray.

Ví dụ, giả sử nhiệm vụ của bạn ở trên là trong một tập tin gọi là Rakefile ở cấp cao nhất của dự án của bạn và Rakefile của bạn không làm bất cứ điều gì mà tải Rails như require File.expand_path('../config/application', __FILE__), bạn có thể làm:

$ rake -f Rakefile spec 

và nó sẽ chạy nhiệm vụ đặc tả của bạn nhanh hơn nhiều. Hãy thử $ time rake -f Rakefile -T; Tôi đã làm điều này với một Rakefile ray độc lập của tôi và nhận được:

real 0m1.543s 
user 0m1.308s 
sys  0m0.201s 

Nhược điểm là bạn phải nhớ để xác định tùy chọn này mỗi lần, và không xác định nó nếu bạn muốn chạy một nhiệm vụ cào từ đường ray như rake db:migrate.

Các vấn đề liên quan