如何加快Ruby / Rake任务的速度

时间:2011-12-17 14:41:16

标签: ruby rake sinatra

rake --tasks需要大约18秒才能运行。这只是加载所有任务所需的时间,因此我定义的任何任务至少需要花费这么多时间才能运行:

$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

我的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

任何想法为什么耙子花了很多次? 感谢

4 个答案:

答案 0 :(得分:5)

尝试spring

命令行将如下所示:

spring rake -T

首次运行需要更多时间,但后续运行速度非常快。

答案 1 :(得分:3)

此解决方案对我有用:Faster rake tasks in Rails

我必须做一点变化,我创建了一个lib/tasks/no_rails目录并将所有不需要Rails的Rake文件放在那里,只加载那些使用上述方法的文件。

答案 2 :(得分:1)

我喜欢Pratik提到的解决方案,一般情况是为需要它的任务加载导轨而不是那些不需要它的任务,对于任何rake任务而不必事先记住。

运行不需要rails的rake任务的微创方法是使用-f rake选项告诉rake使用特定的Rakefile。这样,rake就不会在所有的rails中寻找rake任务。

例如,假设您上面的任务位于项目顶层的Rakefile文件中,并且您的Rakefile没有执行任何加载Rails的任何操作,例如require File.expand_path('../config/application', __FILE__),您可以这样做:

$ rake -f Rakefile spec

它应该更快地运行您的规范任务。试试$ time rake -f Rakefile -T;我用一个独立于轨道的Rakefile做了这个,得到了:

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

缺点是您必须记住每次都指定此选项,如果您想从像rake db:migrate这样的轨道运行rake任务,则不要指定它。

答案 3 :(得分:0)

必须加载整个rails环境,因此即使是rake --tasks等简单的rake任务也需要一段时间。使用rails consolescript/console打开控制台需要相似的时间。您可能会尝试破解Ruby或Rails to speed up rake,但如果您想稍后切换到更新版本,则太多优化可能会很糟糕。由于必须加载rails环境,cleaning up routes也可能有所帮助。