2011-01-21 26 views
14

我有一個有趣的關於我正在使用Clojure和Java開發的應用程序的體系結構問題。應用程序涉及大量密集的併發數據處理任務,需要進行協調。在哪裏可以畫出Clojure和Java之間的界限?

下面是混合兩者的Clojure和Java的理由:

  • 的Java是需要一些相當CPU密集型的數字代碼,在這裏我需要優化算法對JVM儘可能快地運行。 Clojure還不能完全實現這一點,而這樣的代碼在Clojure中不會非常習慣,因爲由於性能原因,算法需要大量可變數據。
  • Clojure(IMHO)對於編排應用程序的整體流程要好得多,它具有對函數式編程,REPL交互式動態開發和併發功能的優秀支持。

鑑於我正在使用兩種語言 - 我應該使用哪些邏輯或原則來確定兩者之間的分界線?特別是,我對如何設計一個能夠利用兩種語言的相對優勢的正確類型的API /接口感興趣。

+0

我對你的第一個陳述有點驚訝:根據我的經驗,做數字代碼非常適合Clojure,但不適合面向對象的方法。就績效而言:你真的衡量了差異嗎?在Clojure中鍵入提示會讓你非常接近Java性能。出於性能原因,我也不明白需要可變數據。也許你可以在這裏舉個例子嗎? – 2011-01-21 13:13:54

+0

@Mauritz - 是的,我測量了差異!類型提示並沒有讓我足夠接近(原始人的拳擊是大殺手,但也有一些其他開銷我不明白 - 也許我會在Clojure 1.4中重新審視:-))。我需要可變性,因爲我必須處理大量的臨時工作數據。 a [i] = a [j] + x在Java中速度非常快,至少比更新任何不可變數據結構(這意味着對象分配和gc開銷)要快一個數量級。 – mikera 2011-01-21 15:07:43

回答

10

沒有評論你對Java和Clojure的相對優勢的看法,並且假設你至少做了一些微觀基準測試來驗證假設有一定的機會是正確的,那麼正確的方法似乎是僅針對需要優化的部分留下Java。

負責數字代碼和計算的類應該用Java編寫,而其他所有類都應該用Clojure編寫。我甚至會採取更積極的方法,只是將這些類設計爲獨特的,以便它們可以用Java編寫,但實際上將它們寫入Clojure並在Java中重寫它們,如果性能證明是一個問題。

2

Clojure在幫助開發人員獲得大部分簡單功能風格方面做得很好,並將突變工作分離到了狹窄區域。

我會在這裏應用相同的指導方針:儘可能地隔離java代碼,因爲您可以在「純功能風格」中完成儘可能多的clojure代碼。因此,考慮到您的約束,Java島將盡可能小,並且訪問Java島將通過一小部分clojure函數。

不知道這有多大幫助,但無論如何!

相關問題