Rails 3 Cli执行命令真的很慢?

时间:2011-07-14 06:31:58

标签: ruby-on-rails ruby command-line-interface execution performance

有人知道为什么我的rails 3.0.7 cli这么慢?当我运行rails srails g时,它需要5秒才能实际执行命令......

任何建议?感谢

1 个答案:

答案 0 :(得分:5)

更新:我正在将我的建议从rrails切换到rails-sh,因为前者支持REPL,这不是rrails的用例。而且,当与ruby环境结合使用时,修补似乎确实增加了性能变量,现在反映在答案中。


一个可能的原因可能是这个performance bug in ruby只要在ruby代码中使用“require”就会调用一些代码(更多细节here)。在使用Rails进行开发时,我在开发框中也遇到了这个问题(我现在在ruby 1.9.3p194上使用rails 3.2.6)。开发环境在Ubuntu上运行,但是这个问题可能在其他操作系统上发生,因为它基于解释器。

虽然这个bug没有修复,但我做了两件事来从ruby CLI中节省时间。第一个是使用rails-sh进行预加载,第二个是使用流行的红宝石性能增强补丁来构建更快的MRI红宝石。

有两个库可以很好地进行预加载:rrailsrails-sh。两者都很棒,但我会讨论 rails-sh ,因为它为终端中的rails console和代码中的binding.pry / debugger等命令提供了REPL支持。 / p>

设置rails-sh

我把它放在我的开发小组中,因为我经常使用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:

这样的rake任务
rails-sh(site)> rake db:test:prepare
12.471001136sec
rails-sh(site)> 

但它快吗?好吧,在我的机器(带有8gig RAM的核心i5笔记本电脑)上,相同的rake db:test:prepare在rails-sh命令(参见上文)中花了12.5秒,相比之下没有它的34秒:

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

22秒的区别在于rails-sh之外的rake命令必须在到达数据库之前加载rails环境,这是浪费的,因为它没有改变。这同样适用于rails命令。

修补红宝石

MRI红宝石的另一种解决方案,与预加载兼容并在rails performance guide中建议,是在ruby 1.9上安装一个流行的补丁(falcon,railsexpress)并添加一些使用的环境变量它

我在rvm安装上测试了falcon和railsexpress补丁(单独),并在两种情况下都获得了类似的性能。

$ 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 here中跟踪哪些红宝石可用的补丁。