性能对比 cruby 2.1 vs jruby 1.7.9 vs rubinius 2.2.3

简介: 圣诞节的时候发布了Ruby 2.1,使用RGenGC,性能提升了5%到15%. 那么,新版的Ruby实现和JRuby、Rubinius相比又如何呢?

圣诞节的时候发布了Ruby 2.1,使用RGenGC,性能提升了5%到15%. 那么,新版的Ruby实现和JRuby、Rubinius相比又如何呢?

image.png

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 -p3000

结果:

Concurrency Level:      16

Time taken for tests:   6.769seconds

Complete requests:      400

Failed requests:        0

Write errors:           0

Total transferred:      3611600bytes

HTML transferred:       3346800bytes

Requests per second:    59.09 [#/sec] (mean)

Time per request:       270.766 [ms] (mean)

Time per request:       16.923 [ms] (mean, acrossallconcurrentrequests)

Transfer rate:          521.03 [Kbytes/sec] received

ConnectionTimes(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

Percentageoftherequestsservedwithinacertaintime(ms)

 50%    270

 66%    283

 75%    288

 80%    293

 90%    308

 95%    315

 98%    324

 99%    327

100%    331(longestrequest)


Rubinius 2.2.3

# config/puma.rb

threads8,32

workers1

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.383seconds

Complete requests:      400

Failed requests:        0

Write errors:           0

Total transferred:      3590400bytes

HTML transferred:       3346800bytes

Requests per second:    42.63 [#/sec] (mean)

Time per request:       375.311 [ms] (mean)

Time per request:       23.457 [ms] (mean, acrossallconcurrentrequests)

Transfer rate:          373.69 [Kbytes/sec] received

ConnectionTimes(ms)

             min  mean[+/-sd] median   max

Connect:        0    0   0.1      0       1

Processing:    84  371105.4    348     731

Waiting:       83  363104.1    338     728

Total:         84  371105.3    348     732

Percentageoftherequestsservedwithinacertaintime(ms)

 50%    348

 66%    390

 75%    431

 80%    458

 90%    526

 95%    571

 98%    640

 99%    683

100%    732(longestrequest)


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.019seconds

Complete requests:      400

Failed requests:        0

Write errors:           0

Total transferred:      3590400bytes

HTML transferred:       3346800bytes

Requests per second:    99.53 [#/sec] (mean)

Time per request:       160.760 [ms] (mean)

Time per request:       10.048 [ms] (mean, acrossallconcurrentrequests)

Transfer rate:          872.42 [Kbytes/sec] received

ConnectionTimes(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

Percentageoftherequestsservedwithinacertaintime(ms)

 50%    157

 66%    166

 75%    173

 80%    177

 90%    189

 95%    204

 98%    232

 99%    260

100%    389(longestrequest)


结论

每个机器上的情况可能有所差异,在你自己的机器上运行上面的测试代码,结果会比较准确。

在多核机器上,jruby和rubinius的性能会有明显提升。

jruby       99.53 #################################

cruby       59.09 ###################

rubinius    42.63 ##############

可以看出,在性能上,JRuby具有明显优势。不过,使用JRuby的话,一些C库需要替换。好在现在大多数gem都支持JRuby了。

更新 感谢ShiningRay指出,jruby开启--serverinvokedynamic性能会更好

相关文章
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
423 4
Java数据库编程指南:实现高效数据存储与访问
|
存储 安全 前端开发
基于springboot的流浪动物救助管理系统
基于springboot的流浪动物救助管理系统
|
1月前
|
边缘计算 JavaScript 前端开发
「玩透ESA」别只把 ESA 当 CDN 用!它的“边缘函数”如何极大扩展 DCDN 场景
阿里云ESA不止是CDN,更是一个可编程的边缘平台。通过边缘函数(ER),开发者能在全球3200+节点运行JavaScript代码,实现A/B测试、API鉴权、动态响应等场景,将逻辑前置到离用户最近处,实现毫秒级响应与源站减负,开启“编程思维”的边缘计算新时代。
214 1
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
1254 163
|
API 数据安全/隐私保护 开发者
商品订单接口获取及作用详解
在电商平台的后台管理中,订单接口至关重要。本文介绍了如何获取商品订单接口及其作用,包括注册开发者账号、创建应用、申请API权限和调用接口获取订单及物流信息的详细步骤,并提供了Python示例代码。同时,强调了遵守平台规则、数据安全和接口维护的重要性。
|
缓存 算法 JavaScript
JIT引擎是如何实现即时编译的
【9月更文挑战第1天】JIT引擎是如何实现即时编译的
369 0
|
机器学习/深度学习 人工智能 小程序
一文秒懂ChatGPT官方提示词最佳实践(中)(一)
一文秒懂ChatGPT官方提示词最佳实践(中)
一文秒懂ChatGPT官方提示词最佳实践(中)(一)
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
334 5
|
Java Linux 测试技术
Maven命令大全:从安装到部署,一篇文章带你玩转Maven
本文由木头左介绍Maven,一个用于Java项目管理的工具,涉及Maven的安装配置(Windows和Linux)及核心命令,包括install、package、compile、clean、deploy、test、verify和site。通过这些命令,可以实现构建、打包、编译、测试、部署和生成项目站点等操作。
|
存储 缓存 移动开发
日常小知识点之用户层网络缓冲区(固定内存,ringbuffer,chainbuffer)
日常小知识点之用户层网络缓冲区(固定内存,ringbuffer,chainbuffer)
386 0