【问题标题】:Where to draw the line between Clojure and Java?Clojure 和 Java 之间的界限在哪里?
【发布时间】: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


【解决方案1】:

Clojure 很好地帮助开发人员以简单的函数式风格完成大部分工作,并将突变工作隔离到有限的区域。

我将在这里应用相同的指导方针:尽可能多地隔离 Java 代码,就像您将尽可能多地以“纯函数式风格”做的 clojure 代码一样。因此,考虑到您的限制,Java 岛将尽可能小,并且对 Java 岛的访问将通过一小组 clojure 函数。

不确定这有多大帮助,但无论如何!

【讨论】:

    【解决方案2】:

    如果不评论您对 Java 和 Clojure 的相对优势的看法,并假设您至少做了一些微基准测试来验证假设有一定的正确性,那么正确的方法似乎是离开Java 仅用于需要优化的部分。

    负责数字代码和计算的类应该用 Java 编写,其他一切都应该用 Clojure 编写。我什至会采取更激进的方法,只是将类设计为不同的,以便它们可以用 Java 编写,但实际上用 Clojure 编写它们,如果性能被证明是一个问题,则用 Java 重写它们.

    【讨论】:

    • 感谢 Yishai - 好主意!连同其他一些实验,我认为这是最好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2010-09-15
    • 2011-01-27
    • 2011-11-03
    • 2011-03-30
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多