性能对比 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性能会更好

相关文章
|
6月前
|
边缘计算 JavaScript 前端开发
「玩透ESA」别只把 ESA 当 CDN 用!它的“边缘函数”如何极大扩展 DCDN 场景
阿里云ESA不止是CDN,更是一个可编程的边缘平台。通过边缘函数(ER),开发者能在全球3200+节点运行JavaScript代码,实现A/B测试、API鉴权、动态响应等场景,将逻辑前置到离用户最近处,实现毫秒级响应与源站减负,开启“编程思维”的边缘计算新时代。
478 1
|
7月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
350 3
|
API 数据安全/隐私保护 开发者
商品订单接口获取及作用详解
在电商平台的后台管理中,订单接口至关重要。本文介绍了如何获取商品订单接口及其作用,包括注册开发者账号、创建应用、申请API权限和调用接口获取订单及物流信息的详细步骤,并提供了Python示例代码。同时,强调了遵守平台规则、数据安全和接口维护的重要性。
|
安全 JavaScript Unix
开源协议不能随便选!选错直接被「背刺」
程序员晚枫带你了解开源协议的重要性!选错协议,你的项目可能被“闭源背刺”或“专利埋雷”。本文详解7大常见协议:GPL、MIT、Apache 2.0、BSD、LGPL、MPL/EPL和Creative Commons。每种协议适用不同场景,例如GPL适合技术民主化,MIT让代码自由传播,Apache 2.0提供专利保护。晚枫结合自身开源项目经验,分享选协议秘籍,助你避免法律风险,守护技术遗产不被滥用。记得查LICENSE文件,别等律师函来了才后悔!
1220 7
|
机器学习/深度学习 人工智能 小程序
一文秒懂ChatGPT官方提示词最佳实践(中)(一)
一文秒懂ChatGPT官方提示词最佳实践(中)
一文秒懂ChatGPT官方提示词最佳实践(中)(一)
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
461 5
|
Java Linux 测试技术
Maven命令大全:从安装到部署,一篇文章带你玩转Maven
本文由木头左介绍Maven,一个用于Java项目管理的工具,涉及Maven的安装配置(Windows和Linux)及核心命令,包括install、package、compile、clean、deploy、test、verify和site。通过这些命令,可以实现构建、打包、编译、测试、部署和生成项目站点等操作。
|
Rust 开发工具 git
性能的极致,Rust的加持,Zed-Dev编辑器快速搭建Python3.10开发环境
快就一个字,甚至比以快著称于世的Sublime 4编辑器都快,这就是Zed.dev编辑器。其底层由 Rust 编写,比基于Electron技术微软开源的编辑器VSCode快一倍有余,性能上无出其右,同时支持多人编辑代码。
性能的极致,Rust的加持,Zed-Dev编辑器快速搭建Python3.10开发环境
|
存储 缓存 移动开发
日常小知识点之用户层网络缓冲区(固定内存,ringbuffer,chainbuffer)
日常小知识点之用户层网络缓冲区(固定内存,ringbuffer,chainbuffer)
496 0
|
Web App开发 移动开发 IDE
laya入门,这一篇应该够了
laya入门,这一篇应该够了
7017 3

热门文章

最新文章