【发布时间】:2012-03-09 10:30:53
【问题描述】:
我想从 Java 环境中调用 Ruby 方法。我尝试了这四种解决方案:
-
使用 JRuby。这将非常好,因为它运行 Java 虚拟机中的所有内容。但是,我遇到了一些关键(不可接受的)性能问题:
- JRuby 目前不适用于我的 C 扩展。
- 来自 Ruby 的 Fork 调用,在 Java 虚拟机中运行时表现不稳定。
- 代码在 JRuby 中的运行速度比在 MRI Ruby 中慢。
- 使用 ROR。通过 Ruby on Rails 提供 Web 服务,完全绕过 Java。这行得通,但违反了公司仅使用 Java Web 服务的 IT 政策,它还迫使 IT 部门(Java 和 Web 服务开发人员)或研发部门(Ruby 和 C 开发人员)在该域之外工作。
- 使用 Java 系统调用。我们可以使用 Java 系统调用调用独立的 Ruby 程序,并通过 XML 文件解析输入和输出数据。这可行,但启动新进程和处理 XML 文件的开销是一个性能问题。
- 使用 RJB。 Ruby Java Bridge 允许我从 Ruby 调用 Java,但这与我需要的相反。
是否有从 Java 调用 MRI Ruby 的方法,而不会出现上述任何问题?
【问题讨论】:
-
只是出于好奇:你在做什么,JRuby 比 MRI 慢? JRuby 比 MRI 有(很多)更高的延迟,但它的吞吐量应该要高得多。否则,JRuby 将认为这是一个错误。
-
我的一位同事大约一年前(201103)研究了 JRuby 解决方案,遇到了我描述的三个问题。不幸的是,此时我没有详细说明为什么 JRuby 似乎在我们的软件上运行得更慢了。主要问题是我们无法让包括 gnu 科学库在内的 C 扩展工作。用 C 编写关键部分的能力是我们获得性能的主要方式,所以无法做到这一点对我们来说是一个主要问题,但也许 JRuby 从那以后有所改进。
-
啊,是的,如果您依赖于 C,那将是一个问题。 JNI 非常慢,主要是由于确保内存和类型安全的复杂性,同时允许像指针算术这样的 C 习惯用法。你检查过 Java 的数字库吗?如今,HotSpot JVM真的真的非常棒,特别是在 Java 7 中。如果它能够与 C 竞争甚至击败 C,我不会感到惊讶。