Ruby性能近况:GC调优、Maglev和MacRuby

Ruby 1.8中的垃圾回收器在去年受到了广泛的关注。Ruby企业版(REE)的开发者们对GC进行了修改,实现了进程间的内存共享(详见InfoQ对创建者的采访)。REE已经成为部署和运行Rails应用的普遍方式,包括37Signals在内的很多实践者都在使用它。最近,REE中的GC有所改进,修正了一些bug,解决突发的冻结问题。

标准Ruby1.8.x的用户很快也可以受益于MBAPI补丁,这一补丁修正了许多GC问题及其相关的内存泄露问题,目前MBAPI由EngineYard提供赞助。

Evan Weaver提供了GC调优小贴士,并推荐了一些可以监控GC的补丁。调优的结果如下:

目前每13个请求GC就会运行一次,代价有些高,每个请求需要耗费0.009秒。这意味着可以快上个34%左右。GC调用频次与RUBY_GC_MALLOC_LIMIT的设置直接相关,但是如果我们将这个值设得再高一些,内存使用量就像吹气球那样爆掉了。

提高性能的另一个方法是寻求其他的Ruby实现,比如得益于现代JVM中成熟GC的JRuby。其他的Ruby实现也将性能的提升作为主要的目标。Rubinius正在稳步发展,而MacRuby最近在它的实验分支上也有新的进展,性能上有所提升。实验分支上的工作正在进行中:

- 这个编译器现在能(据我所知)通过所有的语言规格,所以我猜它现在算是基本完成了。[..]
- 由于以上种种,IRB现在运行得不错!

更多改进:

- 引入了尾部调用消除。这一优化将递归调用转换成本地回路,这样可以防止栈溢出。[..]
- 为了更快解释#eval表达式,研究了LLVM IR解释器。研究结果已经提交,在简单表达式上工作得非常不错。不过缺省情况下不会激活这一功能,这是受调用VM基元的限制所致。我们将不得不稍微修改一下LLVM解释器,让它可以完全使用。这将在不远的将来实现。

最后,GemStone的Ruby实现MagLev正在进行内部的Alpha版测试,Beta版将于Q2推出。现在,兼容性(RubySpec)和基准测试结果在MagLev的网站上已经公布。Twitter上也同步更新项目进展。

查看英文原文:Ruby Performance Roundup: GC Tuning, MagLev, MacRuby

你可能感兴趣的:(Ruby性能近况:GC调优、Maglev和MacRuby)