一台钉枪服务器
可以为 rails 生成 binstub ...</p>
$ bundle binstubs rails
…并对其进行编辑以设置 JRUBY_OPTS。
ENV['JRUBY_OPTS'] = '--1.9 --ng --nailgun-port 2113'
load Gem.bin_path('rails', 'rails')
这样,只有客户端的捆绑器包装部分在捆绑器包装的 nailgun 服务器中执行。
由于 nailgun 不传播信号,您可能需要使用控制器来停止它:
class RailsController < ApplicationController
def stop
Process.kill :INT, 0
end
end
基准:
$ time bin/rails -v # modified
Rails 3.0.11
real 0m3.737s
user 0m6.579s
sys 0m0.223s
$ time bin/rails -v # unmodified
Rails 3.0.11
real 0m5.547s
user 0m12.739s
sys 0m0.411s
$ time bundle exec rails -v
Rails 3.0.11
real 0m9.145s
user 0m20.708s
sys 0m0.682s
两个钉枪服务器
理论上可以使用第二个“非捆绑执行”服务器。为避免显式重启但允许杀死(按两次 Ctrl-C),我建议使用此循环:
$ while sleep 1; do jruby --ng-server 2112; done
第二个 nailgun 实例的端口必须在外部客户端中指定:
$ JRUBY_OPTS='--1.9 --ng --nailgun-port 2112' bin/rails s
我没有看到性能改进,并且出现在“错误”控制台中的输出很烦人。但也许这在其他系统上更快。其他人可能会看到改进这种方法的方法?