【发布时间】:2011-06-13 03:31:45
【问题描述】:
关于我正在使用 Clojure 和 Java 开发的应用程序,我有一个有趣的架构问题。该应用程序涉及大量需要编排的密集的并发数据处理任务。
以下是混合 Clojure 和 Java 的基本原理:
- 一些漂亮的 CPU 密集型数字代码需要 Java,我需要优化算法以在 JVM 上尽可能快地运行。 Clojure 还不能完全实现这一点,而且这样的代码在 Clojure 中不会很惯用,因为出于性能原因,算法需要大量可变数据。
- Clojure(恕我直言)在编排应用程序的整体流程方面要好得多,它对函数式编程、REPL 的交互式动态开发和并发特性提供了出色的支持。
鉴于我同时使用这两种语言 - 我应该应用什么逻辑或原则来确定两者之间的分界线?特别是,我感兴趣的是如何设计一个适当级别的 API/接口,以利用两种语言的相对优势。
【问题讨论】:
-
您的第一句话让我有点惊讶:根据我的经验,数字代码非常适合 Clojure,但不太适合 OO 方法。就性能而言:你真的衡量过差异吗? Clojure 中的类型提示将使您非常接近 Java 性能。出于性能原因,我也不理解对可变数据的需求。也许你可以在这里举个例子?
-
@Mauritz - 是的,我测量了差异!类型提示并没有让我足够接近(原语的装箱是大杀手,但还有一些其他开销我无法弄清楚 - 也许我会在 Clojure 1.4 中重新讨论 :-) )。我需要可变性,因为我必须操作大量临时工作数据。 a[i]=a[j]+x 在 Java 中非常快,当然至少比更新任何不可变数据结构快一个数量级(这意味着对象分配和 gc 开销)。
-
它并没有真正回答你的问题,但你也可以考虑在 C++/C 和 Clojure 的 JNI 中做很多数字方面
-
@justinhj - 是的,我很想这样做,问题是我还需要针对 JVM 平台,所以我必须坚持使用 JVM 语言解决方案。幸运的是,我的测试表明,Java 和 C++ 在此类代码的性能上非常接近。
-
出于好奇,您是否尝试过在 Clojure 中重新实现它?我特别好奇您是否出于可变性目的而研究瞬态。
标签: java api architecture clojure encapsulation