Rails 3 Cli выполняет команды действительно медленно? - PullRequest
6 голосов
/ 14 июля 2011

кто-нибудь знает, почему мои рельсы 3.0.7 cli такие медленные?когда я запускаю rails s или rails g, требуется 5 секунд, пока он на самом деле не выполнит команду ...

любой совет?спасибо

1 Ответ

5 голосов
/ 14 июля 2012

Обновление: Я переключаю свою рекомендацию с rarails на rails-sh, так как первая поддерживает REPL, который не подходит для использования с rarails. Также исправление, похоже, повышает производительность в сочетании с переменными среды ruby. теперь отражено в ответе.


Одной из возможных причин может быть эта ошибка производительности в ruby ​​, из-за которой он вызывает некоторый код всякий раз, когда в коде ruby ​​используется слово "require" (более подробно здесь ). Я также столкнулся с этой проблемой на своем компьютере для разработки при разработке с Rails (сейчас я использую rails 3.2.6 на ruby ​​1.9.3p194). Среда разработки работает в Ubuntu, но эта проблема может возникать в других операционных системах, поскольку она основана на интерпретаторе.

Хотя эта ошибка не исправлена, я сделал две вещи, чтобы сократить время из моего ruby ​​CLI. Первый - это предварительная загрузка с rails-sh, а второй - использование популярного патча повышения производительности ruby ​​для создания более быстрого MRI-рубина.

Есть две библиотеки, которые хорошо выполняют предварительную загрузку: rarails и rails-sh . Оба великолепны, но я буду обсуждать rails-sh , потому что он предлагает поддержку REPL для таких команд, как rails console в терминале и binding.pry / debugger в коде.

Настройка рельсов-ш

Я включил его в свою группу разработчиков, потому что именно там я часто использую команды rails / rake и нуждаюсь в скорости.

group :development do
#...
  gem 'rails-sh'
end

Затем установите его:

bundle install --binstubs=./bundler_stubs

(я использую binstubs, чтобы избежать 'bundle exec' в командах, но это необязательно)

Теперь просто откройте запасной терминал для вашего проекта rails и запустите rails-sh (добавьте bundle exec, если вам нужно):

$ rails-sh

.     ....    ...      ..  .......    ............    ...  ..  .
.  ..  ..  ..  ....  ....  ......  ..............  ......  ..  .
.     ...      ....  ....  .......    ...      ...    ...      .
.  ..  ..  ..  ....  ....  ..........  ..............  ..  ..  .
.  ..  ..  ..  ..      ..      ...    ............    ...  ..  .
................................................................
                                                         v1.5.2

# require /home/yuvilio/ws/site/config/boot
# require /home/yuvilio/ws/site/config/application
# Rails.application.require_environment!
Rails.env: development
type `help` to print help
rails-sh(site)>

Теперь вы можете использовать команду rake и rails в этой подсказке

rails-sh(site)> rails s
$ rails s
=> Booting Thin
=> Rails 3.2.6 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
>> Thin web server (v1.4.1 codename Chromeo)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop

Или для запуска граблей вроде db: test: prepare:

rails-sh(site)> rake db:test:prepare
12.471001136sec
rails-sh(site)> 

Но это быстро? Что ж, на моей машине (основной ноутбук i5 с 8-гигабайтной оперативной памятью) та же самая rake db:test:prepare заняла 12,5 секунд в команде rails-sh (см. Выше) по сравнению с 34 секундами без нее:

$ time rake db:test:prepare
real  0m34.796s
user  0m21.057s
sys 0m1.144s
$

Разница в 22 секунды заключалась в том, что команда rake за пределами rails-sh должна была загрузить среду rails перед тем, как попасть в базу данных, что расточительно, поскольку не изменилось. То же самое относится к rails командам.

пропатченный рубин

Другое решение для рубинов МРТ, которое совместимо с предварительной загрузкой и предложено в руководстве по производительности rails , заключается в установке популярного патча ( сокол , railsexpress) на ваш ruby ​​1.9 и добавьте переменные окружения, которые его используют.

Я протестировал патчи falcon и railsexpress (отдельно) при установке rvm и обнаружил одинаковую производительность в обоих случаях.

$ rvm get head
$ rvm cleanup sources
$ rvm install ruby-1.9.3-p194 --reconfigure  --name falcon  --patch falcon --force-autoconf -j 3
$ rvm use ruby-1.9.3-p194-falcon

Чтобы использовать патч

export RUBY_HEAP_MIN_SLOTS=1000000
export RUBY_HEAP_SLOTS_INCREMENT=1000000
export RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
export RUBY_GC_MALLOC_LIMIT=1000000000
export RUBY_HEAP_FREE_MIN=500000

Вы можете отслеживать, какие патчи для каких рубинов доступны, в rvm здесь .

...