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

Posted

技术标签:

【中文标题】Rails 3 Cli 执行命令真的很慢吗?【英文标题】:Rails 3 Cli executes commands really slow? 【发布时间】:2011-07-14 06:31:57 【问题描述】:

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

有什么建议吗?谢谢

【问题讨论】:

你在使用 ruby​​ 1.9 吗? 【参考方案1】:

更新:我将我的建议从 rrails 切换到 rails-sh,因为前者支持 REPL,这不是 rrails 的用例。此外,与 ruby​​ 环境结合使用时,修补似乎确实可以提高性能变量,现在反映在答案中。


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

虽然该错误尚未修复,但我做了两件事来节省我的 ruby​​ CLI 的时间。第一个是使用 rails-sh 预加载,第二个是使用流行的 ruby​​ 性能提升补丁来构建更快的 MRI ruby​​。

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

设置 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

或者运行一个 rake 任务,比如 db:test:prepare:

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 rubies 的另一种解决方案是在您的 ruby​​ 1.9 上安装一个流行的补丁(falcon,railsexpress)并添加一些使用它的环境变量,它与预加载兼容并在 rails performance guide 中提出建议。

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

【讨论】:

那么这个问题已经在 ruby​​ 主干中“修复”了吗? 没有尝试过trunk,但似乎他们已经发布了补丁来处理当前的rubies。调整答案以反映这一点。

以上是关于Rails 3 Cli 执行命令真的很慢吗?的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的异常真的很慢吗

在 Android 上部署 Qt 应用程序真的很慢吗?

Redis 的 keys 命令你知道有多慢吗?

可以找出哪些 MySQL 查询很慢吗?

更新到 1.30 后,有人体验过 vscode 的速度很慢吗?

字符串连接真的那么慢吗?