圣诞节的时候发布了Ruby 2.1,使用RGenGC,性能提升了5%到15%. 那么,新版的Ruby实现和JRuby、Rubinius相比又如何呢?
Posăceanu Marian做了一个性能测试,对比了cruby、jruby和rubinius.
Marian使用的是ApacheBench,2.3. 性能测试有更好的工具,例如siege。但是ApacheBench的优势是足够简单。
使用如下命令启动ApacheBench:
ab -n400 -c16 -T'application/json' http://localhost:3000/entries
cruby
# config/unicorn.rb
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true
before_fork do |server, worker|
# et cetera
end
命令:
unicorn_rails -c config/unicorn.rb -p 3000
结果:
Concurrency Level: 16
Time taken for tests: 6.769 seconds
Complete requests: 400
Failed requests: 0
Write errors: 0
Total transferred: 3611600 bytes
HTML transferred: 3346800 bytes
Requests per second: 59.09 [#/sec] (mean)
Time per request: 270.766 [ms] (mean)
Time per request: 16.923 [ms] (mean, across all concurrent requests)
Transfer rate: 521.03 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.0 0 5
Processing: 49 267 36.8 270 331
Waiting: 44 266 36.8 269 330
Total: 49 267 36.3 270 331
Percentage of the requests served within a certain time (ms)
50% 270
66% 283
75% 288
80% 293
90% 308
95% 315
98% 324
99% 327
100% 331 (longest request)
Rubinius 2.2.3
# config/puma.rb
threads 8,32
workers 1
preload_app!
on_worker_boot do
# et cetera
end
命令
puma -C config/puma.rb -b tcp://localhost:3000
结果
Concurrency Level: 16
Time taken for tests: 9.383 seconds
Complete requests: 400
Failed requests: 0
Write errors: 0
Total transferred: 3590400 bytes
HTML transferred: 3346800 bytes
Requests per second: 42.63 [#/sec] (mean)
Time per request: 375.311 [ms] (mean)
Time per request: 23.457 [ms] (mean, across all concurrent requests)
Transfer rate: 373.69 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 84 371 105.4 348 731
Waiting: 83 363 104.1 338 728
Total: 84 371 105.3 348 732
Percentage of the requests served within a certain time (ms)
50% 348
66% 390
75% 431
80% 458
90% 526
95% 571
98% 640
99% 683
100% 732 (longest request)
jruby
# config/puma.rb
threads 8,32
preload_app!
on_worker_boot do
ActiveSupport.on_load(:active_record) do
ActiveRecord::Base.establish_connection
end
end
命令:
puma -C config/puma.rb -b tcp://localhost:3000
注意需要替换Gem:
# gem 'pg'
gem 'activerecord-jdbcpostgresql-adapter'
结果:
Concurrency Level: 16
Time taken for tests: 4.019 seconds
Complete requests: 400
Failed requests: 0
Write errors: 0
Total transferred: 3590400 bytes
HTML transferred: 3346800 bytes
Requests per second: 99.53 [#/sec] (mean)
Time per request: 160.760 [ms] (mean)
Time per request: 10.048 [ms] (mean, across all concurrent requests)
Transfer rate: 872.42 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 35 158 31.5 157 389
Waiting: 34 151 27.1 149 261
Total: 36 158 31.5 157 389
Percentage of the requests served within a certain time (ms)
50% 157
66% 166
75% 173
80% 177
90% 189
95% 204
98% 232
99% 260
100% 389 (longest request)
结论
每个机器上的情况可能有所差异,在你自己的机器上运行上面的测试代码,结果会比较准确。
在多核机器上,jruby和rubinius的性能会有明显提升。
jruby 99.53 #################################
cruby 59.09 ###################
rubinius 42.63 ##############
可以看出,在性能上,JRuby具有明显优势。不过,使用JRuby的话,一些C库需要替换。好在现在大多数gem都支持JRuby了。
更新 感谢ShiningRay指出,jruby开启--server
和invokedynamic
性能会更好