2011-01-21 34 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函数。

不知道这有多大帮助,但无论如何!

相关问题