Обновление: Я переключаю свою рекомендацию с 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 здесь .