Подтвердить что ты не робот

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

Большое спасибо!

4b9b3361

Ответ 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

Вы всегда можете добавить среду к этому методу, чтобы переопределить эту функцию и принудительно выполнить требуемую перезагрузку.

Это сработало для меня, поэтому дайте нам знать, если это сработает для вас. Все лучшее.