JRuby核心开发人员Charles Nutter(headius)近日在其博客中连续发表了两篇文章,介绍了最近他所做的一些有意思的事情:让JRuby更快地运行,以及如何用JRuby实现RESTful服务。
\得益于JVM自身的性能优化能力,JRuby的性能能够满足大多数用户的需要,但人们对性能的渴望是无止尽的,自JRuby 1.1.6发布之后的18个月来,整个JRuby开发团队并没有将精力投入在提升性能,现在是时候着手让JRuby的性能更上一层楼了。
\在文章中,Charles首先对JRuby中的Call Site做了简单说明,随后给出了优化方法,他所做的工作主要是针对编译器的,具体如下:
\- 将动态转为静态,让编译器识别动态调用,并将其转为静态调用。\
- 减少Fixnum的使用,在一些调用路径中使用原子类型值而非封装过的RubyFixnum对象。\
- 检测自我递归,直接进行递归调用,而非将其放入动态管道中。\
Charles表示,这样的优化对JRuby的兼容性有一些影响,例如会损坏Ruby的函数调用堆栈等。
\在传统的Ruby中要实现REST,Rails自然是首选,而在Java的世界中情况还不明朗,不过JSR-311(JAX-RS)正试图统一标准,Charles在他的另一篇博客中演示了如何在JRuby中通过Jersey来实现RESTful服务。
\在这个演示中,他用JRuby重写了Jersey入门文档中的范例,其中还使用了一些JRuby 1.5的新特性。只需几条语句就能实现一个RESTful服务:
\require 'java'\
\java_import 'javax.ws.rs.Path'
\java_import 'javax.ws.rs.GET'
\java_import 'javax.ws.rs.Produces'\java_package 'com.headius.demo.jersey'
\java_annotation 'Path(\"/helloworld\")'
\class HelloWorld
\java_annotation 'GET'
\java_annotation 'Produces(\"text/plain\")'
\def cliched_message
\ \"Hello World\"
\end
\end
经过jrubyc的编译,这段代码就能成为一个“真正”的Java类。随后再通过一个简单的服务器程序和一些CLASSPATH设置,就能看到亲切的“Hello World”了。
\JRuby为我们带来了一个又一个的惊喜,它还能做什么?让我们拭目以待吧。