2012-03-09 41 views
1

我想从Java环境中调用Ruby方法。我已经试过这四个解决方案:如何从Java调用/使用MRI Ruby?

  1. 使用JRuby的。这很好,因为它可以在Java虚拟机中运行所有内容。不过,我遇到了一些严重(不可接受的)性能问题:
    • JRuby目前不支持我的C扩展。
    • Ruby中的fork调用在Java虚拟机中运行时不稳定。
    • JRuby中的代码运行速度比MRI Ruby中慢。
  2. 使用ROR。通过通过Ruby on Rails提供Web服务来绕过Java。这虽然有效但打破了IT公司只使用Java web服务的IT政策,它也迫使IT部门(Java和Web服务开发人员)或R部门(Ruby和C开发人员)在域外工作。
  3. 使用Java系统调用。我们可以使用Java系统调用来调用独立的Ruby程序,并通过XML文件解析输入和输出数据。这可行,但启动新进程和处理XML文件的开销是一个性能问题。
  4. 使用RJB。 Ruby Java Bridge允许我从Ruby调用Java,但这与我需要的相反。

有没有从Java调用MRI Ruby的方法,没有任何上述问题?

+1

出于好奇:你在做什么,JRuby比MRI慢? JRuby比MRI有更高的延迟,但其吞吐量应该明显更高。否则,JRuby *会*认为这是一个错误。 – 2012-03-09 11:05:20

+0

大约一年前(201103),我的一位同事研究了JRuby解决方案,遇到了我所描述的三个问题。在这个时候,我不幸没有详细了解为什么JRuby似乎用我们的软件运行得更慢。主要问题是我们无法获得包括gnu科学图书馆在内的C扩展工作。以C语言编写关键部分的能力是我们获得性能的主要方式,所以无法做到这一点对我们来说是一个主要问题,但也许JRuby自此就有所改进。 – 2012-03-09 14:09:53

+0

啊,是的,如果你依赖于C,那将是一个问题。 JNI *非常慢,主要是由于确保内存和类型安全的复杂性,同时允许像指针算术这样的C语言。你有没有检查Java的数值库?现在,HotSpot JVM真的非常令人难以置信,特别是在Java 7中,令人难以置信的是它令人难以置信,尤其是在Java 7中。如果它可以与C竞争甚至击败C,我不会感到惊讶。 – 2012-03-09 14:31:33

回答

1

你可以做#3更有效率

  • 没有启动的过程,而是使用一个长期运行的守护进程
  • 没有通信通过的文件,但通过使用的东西比XML更有效的管
  • ,像协议缓冲区

但总的来说,我没有看到你错过了任何选项。抱歉。