InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

Rubinius近期概况

作者 Werner Schuster 译者 木雨宝道 发布于 2007年9月30日

领域
架构 & 设计,
语言 & 开发
主题
动态语言 ,
Ruby ,
性能和可伸缩性
标签
JRuby ,
Rubinius

Rubinius是一个主要用Ruby语言实现的Ruby虚拟机,它的底层实现包括少量C,不过这部分也会在将来用Ruby来重写。(更多的细节参见InfoQ的采访Evan Phoenix谈Rubinius)。

在过去的一年当中,Rubinius受到了广泛的关注并且聚集了一批为缩短未完成功能和不兼容列表而不懈奋斗的忠实开发者。JRuby团队的Ola Bini,在一片名为“Rubinius很重要”的文章当中表达了他对Rubinius的观点:

实际上,我已经越来越确信对于那些不需要庞大的Java基础设施的人来说,Ruby世界中Rubinius是最为重要的一个项目。更为重要的是,Rubinius在MRI(Matz's Ruby Interpreter,标准的Ruby实现)方面做的非常正确。如果按照现在对Ruby1.9.1的时间安排和计划没有大的改变,那么我预测Rubinius将会在未来的6个月时间内,成为CRuby实现的不二选择。

他列举了若干论据来支持自己的观点:

  • 它是基于字节码的,这意味着它能够很好的解决性能问题。
  • 它是可插拔的,架构非常的干净,这意味着诸如垃圾回收和对象内存等问题,能够转换使用另一种算法。
  • 它被设计成线程安全的(尽管还没有达到真正的线程安全),并能支持多个虚拟机。
  • 它可以与现有的MRI扩展一起工作。
  • 大部分的代码用Ruby编写。
  • 它能够给你直接从Ruby代码,访问所有内部结构的能力(比如MethodContexts/BlockContexts等)。
  • 这个项目使用Valgrind(一套调试、分析Linux程序的工具)来保证编写的C代码万无一失。

另一个有进步的方面就是性能。Evan Phoenix最近发布了一些关于Rubinius和Ruby 1.8.x(MRI)比较的测试结果,结果显示Rubinius在很多测试中处于领先的地位。以下是Evan Phoenix的分析:

我想指出这些数据当中的几个趋势。

  • 对于没有产生错误和超时的测试,Rubinius在31个中有24个更快,这很令人惊喜,因为这个结果比之前一次测试的结果有了巨大的提高。
  • bm_so部分表现的最慢,Rubinius仅在11个测试中有2个更快一些,4个出现错误或者超时。如果你看一下那些测试程序,你会发现它们都是一些针对核心方法的基本测试,主要包括像String#<<。因此在这个阶段是有意义的,我们在那些方面是要慢上一些。我们还尚未在那些方面上进行过调优呢。
  • 另一个大趋势就是那些仅仅给VM架构加压的测试结果显示Rubinius要快很多。其中两个例子就是bm_vm1_swap和bm_vm1_simplereturn,第一个交换两个本地变量,执行a, b = b, a几百万次。这个例子很好地展示,字节码虚拟机要远远快于MRI中遍历树结构实现方式。下一个,bm_vm1_simplereturn显示了Rubinius快速创建一个方法的上下文(method context)并且快速返回给调用者的能力。我对于这一点激动不已,因为即使Rubinius的MethodContext是语言中的一等公民,它仍旧有三倍于MRI的速度优势,同时不失强大的编程能力。

有一点很重要需要指出:Rubinius使用的是字节码解释。众多优化手段,比如即时编译(JIT),将字节码在运行时转换成原生码,或者其他方法将会在以后出现,所以更多的性能提升仍然值得期待。另一些优化的技术,比如高级或者可配置垃圾回收策略甚至能更高的提升性能。

Rubinius受到各种形式的支持:Evan Phoenix受雇于EngineYard,用他一半的时间来开发Rubinius;最近Sun为Rubinius开发者Wilson BilkovichBrian Ford资助了旅费,并且将JRuby的成员Charles Nutter送到了Rubinius Sprint 。通过看到一系列的改进列表,就不难推断出这是一个颇有成效的会议:

  • Evan将Syck(YAML解析器)融入了进来,使用了我们非常酷的反向(Ruby C API 兼容)组件。
  • Wilson在几个小时内鼓捣出一堆StringIO的测试规格。
  • Evan迅速地写了一个能够通过测试规格的Ruby StringIO
  • Charles抹去了几个在接下来编译过程中引起不小问题的def和case规格。
  • Wilson添加了那些彩色的回溯跟踪(backtrace),它能够让你快速地找到最终出错的那行代码,同时还有其它一些重要的回溯跟踪的功能。
  • Wilson实现了剩下的在编译器中缺少的case支持。
  • Charles添加了一些ObjectSpace的基本支持。
  • 我提交了一个对于我们Ruby核心库测试规格的完整重组和许多改进。我们已经有2800多个测试规格,其中三分之二已经通过了测试。我们还有将近50%的核心库测试规格要完成。
  • Evan修改了对于线程的支持,并且添加了一些优先级别。
  • 我添加了(在Evan的大力帮助下,同时查看x86机器代码的一些重要gdb sessions)一些很酷的东西到我们的“对外功能接口”(Foreign Function Interface, FFI),以支持读写C整数和Ruby浮点型。(浮点支持仍旧需要Evan金手指的一两下点拨)。有了这些,我就能完成我们的Math方法支持,和其他的Math测试规格。
  • Wilson推敲出一堆支持编译eval时需要的方法。 如果你没有意识到这有多么的恐怖(痛苦),别怪我。
  • 我开始了一个为准备Dir.glob而写的File.fnmatch的实现(否则我才不会跟亲爱的glob我那么熟络呢),同时清理了我们的fnmatch测试规格。

正如在最近一篇关于Gemstone对JRuby和Rubinius的支持的采访中提到的,Rubinius看起来也在Germstone的面向对象数据库(Gemstone's Object Oriented Database,OODB)的Ruby计划中扮演着重要的角色。

查看英文原文:Rubinius roundup
译者简介:木雨宝道,Ruby On Rails开发者,关注各种Web开发技术,敏捷开发爱好者,很少饮酒。参与InfoQ中文站内容建设,请邮件至china-editorial[at]infoq.com

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。