写点什么

Oniguruma 的 Java 移植版让 JRuby 提速

2007 年 12 月 02 日

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

2007 年 12 月 02 日 17:14581
用户头像

发布了 225 篇内容, 共 47.8 次阅读, 收获喜欢 26 次。

关注

评论

发布
暂无评论
发现更多内容

极客时间架构 1 期:第 13 周 数据应用(二) - 命题作业

Null

第十三周作业

Meow

架构师训练营 总结9

Arthur

极客大学架构师训练营

第十三周总结

fmouse

极客大学架构师训练营

架构师训练营第 13 周课后练习

叶纪想

极客大学架构师训练营

第九章作业

Geek_9527

团队沟通中的教练式对话

Alan

团队管理 个人成长 教练 28天写作

「架构师训练营第 1 期」第十三周作业

张国荣

第四周学习总结

胡益

架构师训练营 1 期 - 第 十三周总结(vaik)

行之

极客大学架构师训练营

第 9 周作业

Steven

极客大学架构师训练营

架构师训练营 作业9

Arthur

极客大学架构师训练营

week9-作业一

未来已来

架构师训练营 Week13 - 课后作业

冉

极客大学架构师训练营

架构师知识体系

天天向上

极客大学架构师训练营

【架构师训练营 1 期】第十三周作业

诺乐

常用数据分析指标,PageRank算法

garlic

极客大学架构师训练营

架构师训练营第9周 命题作业

月下独酌

极客大学架构师训练营

架构2期-第九周作业(1)

浮生一梦

极客大学架构师训练营 2组 第九周作业

第十三周 作业1

Yangjing

极客大学架构师训练营

大数据技术与应用

天天向上

极客大学架构师训练营

第十三周作业

fmouse

极客大学架构师训练营

极客时间架构 1 期:第 13 周 数据应用(二) - 学习总结

Null

第四周作业

胡益

以满天星辰为灯塔,照亮百度“大航海计划”背后的AI棋局

脑极体

架构师训练营 Week13 - 数据应用(2) 总结

冉

极客大学架构师训练营

第九周大作业

小兵

架构师训练营第一期 - 第十三周课后作业

卖猪肉的大叔

极客大学架构师训练营

架构入门感悟之九

莫问

架构师训练营 1 期 - 第 十三周作业(vaik)

行之

极客大学架构师训练营

Architecture Phase1 Week13:HomeWork

phylony-lu

极客大学架构师训练营

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Oniguruma的Java移植版让JRuby提速-InfoQ