Rails 3 - ускорить время загрузки консоли
Мне интересно, есть ли относительно простой способ ускорить мое время загрузки консоли, которое начинает приближаться к 30 секундам. У меня много подклассов, чьи методы не влияют на reload!
, поэтому я в конечном итоге открываю и закрываю консоль. IRB быстро загружает молнию.
Есть ли у меня слишком много драгоценных камней? Как я могу рассказать о задачах загрузки, чтобы я мог видеть, что занимает больше всего времени? Как вы можете видеть, я уже пробовал камкордер dev-boost безрезультатно. Приложение прекрасно в Пассажире, это просто загрузка консоли, которая меня извращает. Работает на MBP OSX 10.6.6 с 2,4 ГГц и 4 ГБ оперативной памяти. Не использовать RVM.
Версии:
Ovid$ rails -v
Rails 3.0.3
Ovid$ ruby -v
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10]
Память:
Ovid$ vm_stat
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free: 118818.
Pages active: 341320.
Pages inactive: 99490.
Pages speculative: 310576.
Pages wired down: 112527.
"Translation faults": 23097323.
Pages copy-on-write: 1270961.
Pages zero filled: 13836659.
Pages reactivated: 36.
Pageins: 165761.
Pageouts: 0.
Object cache: 28 hits of 760846 lookups (0% hit rate)
Gemfile:
source 'http://rubygems.org'
gem 'rails', '3.0.3'
gem 'mysql2'
gem 'foreigner'
gem 'haml'
gem 'capistrano'
gem 'nokogiri'
#web services
gem 'yammer4r'
gem 'ruby-freshbooks'
#authentication gems from nifty generator
gem "bcrypt-ruby", :require => "bcrypt"
gem "mocha", :group => :test
gem 'authlogic'
#dev
group :development do
gem 'rails-dev-boost', :git => 'git://github.com/thedarkone/rails-dev-boost.git', :require => 'rails_development_boost'
end
#testing
group :test do
gem 'database_cleaner'
gem 'cucumber-rails'
gem 'cucumber'
gem 'rspec-rails'
gem 'spork'
gem 'launchy'
gem 'machinist'
gem 'faker'
gem 'capybara'
end
Большое спасибо!
Ответы
Ответ 1
Наконец-то я нашел свои узкие места для запуска с помощью Benchmark. В частности, перейдите к драгоценному камню связки и в lib/bundler/runtime.rb найдите строку, которая делает Kernel.require, и завершите ее следующим образом:
puts Benchmark.measure("require #{file}") {
Kernel.require file
}.format("%n: %t %r")
Вам может потребоваться добавить "benchmark" где-нибудь в вашем приложении, например, в config/boot.rb. Это покажет вам, сколько времени потребуется, чтобы потребовать каждый драгоценный камень. Я не могу гарантировать, что ваши результаты будут соответствовать моим, но у меня было несколько драгоценных камней, которые занимали больше секунды для загрузки по сравнению с субмиллисекундой для большинства. Некоторые из них были драгоценными камнями, которые мне не нужны для разработки, но мне нужно было выполнять некоторые задачи в среде разработки, например. capistrano, shoulda. Я сравнивал другие области запуска (инициализаторы и т.д.), Но не смог найти существенных узких мест.
Я еще не понял, как настроить приложение только для загрузки тех задач, где они действительно нужны. Возможно, я мог бы создать среду под названием: speedy и использовать RAILS_ENV = speedy rails s/c для запуска, когда я знаю, что мне не нужны эти драгоценные камни. Затем в Gemfile я мог бы использовать группу: быстрая, чтобы исключить эти драгоценные камни в определенных случаях.
Все, что сказал, самое большое раздражение для меня - загрузить всю среду, чтобы выполнить задачу рейка. Я мог бы исключить большинство камней для этого, но Gemfile начнет запутываться, поэтому я не знаю, стоит ли это.
Ответ 2
Немного адаптированная форма, пригодная для копирования, обертывает все и предоставляет сортируемый вывод:
# Add this to the top of boot.rb
require 'benchmark'
def require(file)
puts Benchmark.measure("") {
super
}.format("%t require #{file}")
end
Затем вы можете выполнить no-op, чтобы увидеть их:
rails runner 1
Или отсортируйте их и покажите верхнюю часть 50:
rails runner 1 | sort -nr | head -n 50
Ответ 3
Вы можете ускорить его, добавив: require = > nil в записи медленного Gemfile и потребовать их вручную.
например.
gem 'jammit', :require => nil
Я также затронул эту проблему в ходе встречи, которую у меня был.
Это похоже на ошибку в ruby 1.9.2 (см. Комментарии к этому патчу: https://gist.github.com/1008945)
Вы можете исправить это, исправив ваш 1.9.2
сущностью, которую я только что связал или обновил до 1.9.2-head
или 1.9.3-head
.
Ответ 4
Я могу только предложить надеть ваше лабораторное пальто и делить пополам вопрос. Посмотрите, комментирует ли вы, что ваши требования к драгоценному камню ускоряют работу (предположительно, это также связано с комментированием фрагментов кода, которые полагаются на эти драгоценные камни). Если да, прокомментируйте половину за раз и т.д.
Извините, это не реальный ответ. Можно попробовать ruby-prof, предположим, например, вызывая его с помощью rails runner
и no-op script.
Я попробовал ruby-prof script/rails runner 'nil'
на моем mac, но, похоже, он просто разбился: -)
ИЗМЕНИТЬ
Если вы используете git для своего приложения, вы можете попробовать также эту команду bisect и посмотреть, есть ли какой-то момент времени, когда все становится медленным, а не просто общим раздуванием.
Ответ 5
Это определенно касается очистки вашего кода и выявления узких мест, но как только вы сделали эти сбережения, стоит посмотреть на что-то вроде Zeus, чтобы ускорить время вашего dev.
gem install zeus
https://github.com/burke/zeus (docs)
Он не без ошибок и иногда требует перезагрузки, но я все еще вижу общее увеличение времени разработки благодаря быстрой перезагрузке сервера и консоли после небольших изменений кода.
Ответ 6
Reload! был проблемой в течение некоторого времени. Посмотрите . Есть некоторые исправления, которые вы могли бы использовать, и некоторые советы о том, как вы, возможно, сможете обойти свою проблему.
Метод перезагрузки выглядит следующим образом.
# reloads the environment
def reload!(print=true)
puts "Reloading..." if print
ActionDispatch::Callbacks.new(lambda {}, false).call({})
true
end
Вы всегда можете добавить среду к этому методу, чтобы переопределить эту функцию и принудительно выполнить требуемую перезагрузку.
Это сработало для меня, поэтому дайте нам знать, если это сработает для вас. Все лучшее.