2012-03-09 43 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更有效的管
  • ,像協議緩衝區

但總的來說,我沒有看到你錯過了任何選項。抱歉。