InfoQ

新闻

Oniguruma的Java移植版让JRuby提速

作者 Werner Schuster译者 郭晓刚 发布于 2007年12月2日 下午5时14分

社区
Ruby,
Java
主题
性能和可伸缩性,
Ruby on Rails,
JRuby,
语言
标签
语言特性,
性能和扩展性,
JRuby

Ola Bini 报告说Oniguruma的移植版Joni已被合并入JRuby的代码主干

这是光辉的一天!Joni(Oniguruma正则表达式引擎的Java移植版,Marcin的出色成果)已经被合并入JRuby的代码主干。现在看起来工作得非常好。

JRuby团队成员Marcin Mielczynski当初接下了将Oniguruma Regex引擎移植到Java代码的工作——Oniguruma是Ruby 1.9.x中包含的正则表达式引擎。

总也说不完的JRuby与正则表达式(Regex)引擎之间的故事,这次总算画上了句号。早期的JRuby使用Java内建的Regex库(由Java 1.4引入)来实现Ruby正则表达式。虽然这是最简单的方案,不需要任何第三方库或者移植,但它也带来了一些问题,因此不适合JRuby。由于JRuby目标是成为与Ruby 1.8.x(及以后版本)兼容的实现,因此有必要支持同样的正则表达式。Java内建的实现被发现不兼容,部分是因为算法中的实现细节让它不能处理某些表达式。Ola解释了随后的步骤

为了解决这个问题,我们集成了JRegex作为替代。这是JRuby 1.0发布时带的引擎,现在用的也仍然是它。它工作得很好。对于一个用Java编写的引擎来说,它已经算快了,但还不够快。具体地说,它不支持对字符串的精确查找,不支持fail-fast,而且该引擎要求我们把byte[]字符串转换成char[]或者String。不尽理想。另一个问题是损害了与MRI的兼容性,特别是在多字节支持上。

所有这些问题应该也将会被Joni解决掉。Regex性能过去是一个大问题(例子可见《在JRuby on Rails上构建Oracle Mix的收获》),Joni看起来对此也有帮助。Charles Nutter用新的代码来检验了REXML的性能

在经过一系列基本的优化后,我们先前担忧的大多数关键表达式的性能都至少和JRegex一样,甚至要好很多,于是Ola花了几天时间完成了转换。Marcin正继续在进行各种优化。我和Ola都已经试验过新的代码。看起来很不错。

Nutter接着给出了合并代码前后的基准测试结果对比,数据显示出Joni代码带来了显著的速度提升。

这个问题也暴露出了很多Ruby实现共同面对的一个麻烦。Rubinius是大部分用Ruby编写的一个Ruby实现,它可以直接采用最简单的方案——包含Oniguruma。但在VM(如JVM和.NET)上完成的Ruby实现,如果要包含一个原生库,会让部署变得更加困难(它们必须为各平台发行专门的版本)。除此之外,Marcin指出还存在其它集成问题

我们已经考虑过[包含Oniguruma]。有几个理由:
多线程:Oniguruma在初始化代码范围表或者管理共享的AST节点(如Character类散列表)时,使用全局锁。Oniguruma字节码解释器也使用线程锁(可以关闭该特性,但在Java中这项特性是自带的,而且混合异种线程和Java线程属于歪道)。
异常:很难从segfaults从恢复。把Oniguruma转换成Ruby异常也是一种丑陋的歪道。
JNI:JNI要求本地数据与VM数据分离,因此所有的字符串、字节都要进行复制。
额外的二进制分发包:希望你编译时不会遇到什么麻烦:D
查看英文原文:Oniguruma Java port speeds up JRuby

没有回复

回复

深度内容

Flex与JSON及XML的互操作

平台需要互操作性。在这篇文章中,作者仔细研究了Flex和JSON及XML的互操作性。文章也包含了使用E4X库来将XML映射到图表和表格组件的内容,还演示了如何使用as3core库来解码JSON消息。

用Qi4j进行面向组合编程

本文将简要介绍面向组合编程(COP,Composite Oriented Programming)的概念,展示它如何规避OOP存在的一些问题,并重新点燃使用可重用部件组装领域模型(Domain Model)的希望。

系统开发——新学科,新教育

一门新的计算机学科——“系统开发”,强调人性化、匠艺、设计、创意、创新和新事物的涌现,并建议用被称为“bottega”的工作室替代乏善可陈的教室。

图书聚焦:Visual Studio 2008 揭秘

Mike Snell和Lars Powers用他们最近由Sams出版的新书《Visual Studio 2008揭秘》,试图帮助大家提高开发人员的生产力。本文包括一个下载样章——第10章调试。

BPEL为何不是BPM的圣杯?

Pierre Vigneras在本文中讨论了作为标准之一的BPEL所存在的问题。Pierre先给我们大致介绍了一个简单的并行流程,接着讨论了从业者在试图以一个结构化模型为基础表达非结构化流程时遇到的一系列问题。

基于范型的多语言编程

你是否仔细思考过,为什么人们总在讨论“要正确的语言做恰当的事情”?在这篇文章中,Sadek Drobi向你解释了为什么应该在系统内部混合使用多种语言。

采访与书摘《Pro Web 2.0 Application Development with GWT》

Jeff Dwyer就关于他的新书(《Pro Web 2.0 Application Development with GWT》)、GWT1.5以及创建可搜索的Ajax应用谈了一些他的见解。

时刻准备着,迎接IT业的春天

我们需要设身处地地为客户及客户的业务本身着想,与客户同舟共济。更多创新的思路、产品和模式也同样将为IT业带来新的出路。IT业并不需要坐以待毙,在春天到来之后,市场将会更加繁荣!