【问题标题】:How to call/use MRI Ruby from Java?如何从 Java 调用/使用 MRI Ruby?
【发布时间】:2012-03-09 10:30:53
【问题描述】:

我想从 Java 环境中调用 Ruby 方法。我尝试了这四种解决方案:

  1. 使用 JRuby。这将非常好,因为它运行 Java 虚拟机中的所有内容。但是,我遇到了一些关键(不可接受的)性能问题:
    • JRuby 目前不适用于我的 C 扩展。
    • 来自 Ruby 的 Fork 调用,在 Java 虚拟机中运行时表现不稳定。
    • 代码在 JRuby 中的运行速度比在 MRI Ruby 中慢。
  2. 使用 ROR。通过 Ruby on Rails 提供 Web 服务,完全绕过 Java。这行得通,但违反了公司仅使用 Java Web 服务的 IT 政策,它还迫使 IT 部门(Java 和 Web 服务开发人员)或研发部门(Ruby 和 C 开发人员)在该域之外工作。
  3. 使用 Java 系统调用。我们可以使用 Java 系统调用调用独立的 Ruby 程序,并通过 XML 文件解析输入和输出数据。这可行,但启动新进程和处理 XML 文件的开销是一个性能问题。
  4. 使用 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,我不会感到惊讶。

标签: java c ruby jruby


【解决方案1】:

你可以让#3更高效

  • 不启动进程,而是使用长时间运行的守护进程
  • 不是通过文件而是通过管道进行通信
  • 使用比 XML 更高效的东西,例如协议缓冲区

但总的来说,我没有看到您错过的任何选项。对不起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多