关于性能和Java互操作性:Clojure与Scala


82

我已经读过Clojure vs. Scala的各种论述,而我意识到两者都有自己的位置。关于将Clojure与Scala进行比较时,有一些注意事项尚未得到完整的解释:

1.)两种语言中哪一种通常更快?我意识到这从一种语言功能到另一种语言功能都会有所不同,但是对性能进行总体评估会有所帮助。例如:我知道Python字典的速度非常快。但作为一个整体,它是一个比Java慢语。我不想和Clojure一起去解决这个问题。

2.)与Java的互操作性如何?到目前为止,我所读到的只是Scala具有本机集合类型,使其与大型Java代码库集成有点笨拙,而Clojure遵循一种简单的以Iterable / Iterator为中心的方式与Java类进行互操作。还有其他想法/细节吗?

最终,如果Clojure和Scala之间的距离足够近,我可能会同时尝试它们。关于Clojure的一件事是该语言看起来非常简单。但是话又说回来,Scala具有非常灵活的类型系统。但是,我知道Scala速度很快(基于多个个人帐户)。因此,如果Clojure的速度明显慢一些:我想早点知道。


1
使用Clojure 1.2,Clojure可以调用Java,而不会产生开销。查看assembla.com/wiki/show/clojure/Datatypesassembla.com/wiki/show/clojure/New_new。这样做是因为Clojure希望与Java接近,但要在Clojure中实现。
nickik 2010年

Answers:


73

我认为这两种语言对您来说都足够快。在比较Python和Java时,将速度差异归咎于该语言似乎有点不合理。Java是经过编译的JIT(移动设备上除外),而Python是经过解释的。仅仅因为两者都使用字节码并不意味着实现将具有与远程相当的性能。但是Scala和Clojure都是JVM语言,因此它们应该具有相似的性能。

与Clojure相比,Scala具有一些实现上的优势,我希望它具有更高的性能。尽管Scala的静态类型通常会比Clojure的鸭子类型具有更快的速度,但是Clojure确实支持类型提示,这可以显着加快代码的速度。可能,普通的Scala比普通的Clojure快,但是您只需要优化瓶颈即可。程序的大部分运行时间是由少量实际代码生成的。

关于带有Java的互操作,Scala更接近Java,但是我确信两种语言都可以很好地互操作。在编程Clojure的斯图尔特哈洛韦写道:“[您可以访问]任何你能够从Java代码实现。 ”。

自从Scala的作者Martin Odersky编写了Sun的Java编译器以来,我还认为Scala方面也没有任何问题。:-)

您将很难选择两种更好的语言,尽管我也喜欢Ruby。您为什么担心尝试哪个?为什么不同时尝试它们呢?Scala更有可能成为“下一个Java”,尽管很难想象Lisp会在50多年后终于起飞。但是很明显,Lisp处于其自己独特的抽象水平,并且Clojure非常简单,因此Scala + Clojure不会比仅仅是(相当复杂的)Scala难得多,而且我敢肯定,您会感到高兴它。

为此,他们可以互操作...

* dalvik(Android的JVM)在2010年获得了2.2版的JIT编译器


6
嗯 好吧,感谢您的所有见解。一开始,我处于只选择一个并运行的模式。但是由于某种原因,我没有想到我可以同时使用它们并使它们互操作。因此,也许我会选择两者并与他们进行快速漫步:-)
Ryan Delucchi

7
而且我想补充一点,我确实对LISP有点“情有独钟”,因此Clojure患有肢体炎的事实不足以吓倒我。
Ryan Delucchi

8
用JVM编写的语言并非总是能够以最快的速度执行。原始的JRuby表现糟糕,因为它是编译到JVM而不是源代码的解释器。语言也可能是罪魁祸首。静态类型语言通常更容易优化不同于动态语言,等等
比尔ķ

7
-1“ Scala和Clojure都是JVM语言,因此它们应该具有相似的性能”完全没有道理。需要与Java之类的静态语言保持互操作性的动态语言,总是要慢得多(重载要付出巨大的代价,类型提示不能解决所有问题,等等)
jux

4
@julkiewicz-动态语言总是慢很多,这是不对的。这取决于您的编译器是否可以在优化相关代码方面做得不错。例如,在Clojure中,您可以使用与Java性能完全匹配的Java原语进行算术运算。同样,在带类型提示的Java对象上调用方法与Java对象方法调用一样快。Clojure编译器实质上产生与javac相同的字节码,以产生等效的Java代码。
mikera

32

在目前的JVM中,Scala在静态类型方面具有优势,因为JVM对动态类型(反射)的支持很慢。实际上,出于这个原因,经常警告人们必须通过相同的技术,结构类型来实现一个Scala功能。

而且,Scala可以很好地接受可变对象,并且某些算法通过可变性可以更快地实现。

由于Scala和Java本质上都是基于类的语言,因此它们更易于互操作。或者,也许更无缝地。Java类是Scala的类,而Scala类是Java的类。当涉及到Scala的单例或Java的静态成员时,可能会出现问题,尤其是当涉及到一个框架,期望事情以某种方式工作时,尤其如此。

所以我会在这两个帐户上都使用Scala 。Clojure在许多方面是一种更好的语言,它当然具有Scala到目前为止尚不存在的非常有趣的功能,但是您可以通过充分发挥功能来获得这些好处。如果您打算这样做,那么Clojure可能会更好。如果您不这样做,那么您可能应该留在Scala。


9
Clojure的功能编程功能是我考虑使用这种语言的最引人注目的原因。我到达了一个地步:如果我不以某种功能的方式编写某些东西,为什么无论如何我还是要为嵌入Java的脚本语言而烦恼?我已经可以使用Python来完成快捷任务。
Ryan Delucchi

9
然后选择Clojure。
Daniel C. Sobral

“ Java中嵌入的脚本语言”。请说明理由。
2011年

@Daniel:抱歉造成混乱。我的意思是对Ryan Delucchi的评论。他说Scala是一种“嵌入在Java中的脚本语言”,我不买。(除非他指的是Clojure,我对此一无所知)。
2011年

@ Jus12我认为这意味着他这些语言用作JVM脚本语言,并且鉴于此,除非他开始使用功能,否则他在Python中看不到任何优势。再说一次,我不是他,所以我只能猜测。
Daniel C. Sobral

20

请注意,Clojure和Scala是两种完全不同的编程语言类型-Clojure是一种功能类似于Lisp的语言,它不是面向对象的。Scala是一种具有功能编程功能的面向对象语言。

我认为,语言的功能和概念(功能,面向对象...)是选择语言的重要标准,而不是性能(该语言的特定实现)的重要标准-尽管我知道您不会希望陷入一种没有良好执行的语言的困境。

我会选择Scala,因为它是面向对象的,但也允许您学习函数式编程(如果您对此感兴趣)。另一方面,如果您不关心OO,并且想学习“纯”函数式编程,请尝试使用Clojure。


9
显然,您没有使用Clojure。Clojure大约与Scala的功能一样面向对象。您可以实现接口,扩展类,声明私有和静态函数等(clojure.org/java_interop)。
理查德·克莱顿

28
Clojure中存在那些与Java互操作性的东西,但是类和对象显然不是Clojure的主要功能。如果要使用Clojure进行编程,则不会以OO方式创建类和设计项目。
杰斯珀,2010年

>>“比表演”。问题是:当-在一个项目的深处-发现性能很差-而不是仅仅因为一小部分(您已经计划将其转换为Java的原因)时,会发生什么。虽然我在这里不打算说“不要使用clojure-period ..”,但应该清楚的是,clojure在表演舞台上的风险更大。对于无关紧要的应用程序级代码,有很多机会:但是在很多框架/多线程/处理密集型代码库中,这将是一个责任。
StephenBoesch 2015年

@javadba Clojure对低级多线程代码不利的想法似乎很武断。Clojure的设计使其很难犯多线程编程错误。Clojure语言核心的不可变数据和STM功能在Scala核心中不可用,并且它们使程序员意外地在其代码中插入竞争条件或死锁的可能性大大降低。当然,这比从静态类型的语言(例如Scala或Java)获得的几毫秒的运行时间更有价值。
nben

“当然,这比运行时间的几毫秒更有价值”。这取决于数据的规模。几毫秒对于几条记录就​​可以了。乘以数亿..
StephenBoesch 2015年

16
  1. 成语斯卡拉快于惯用的Clojure,并将继续如此。
  2. Scala和Clojure都可以轻松地放在Java之上。两者都不位于其下方。

如果您的代码始终是时间紧迫的或空间紧迫的,请坚持使用Java。但这不是,即使您认为是。

计算机语言基准测试”对Clojure的真实资源成本影响不大。没有使用Clojure数据结构。功能和序列抽象不会出现。

Clojure看起来很简单。不是,但是富有表现力。它的运行速度可能比Java慢五倍,但源代码(YMMV)却小五倍。对于大多数应用程序而言,这是一个巨大的胜利。但是对于某些人以及许多其他人来说,这是毁灭性的损失。

凭借Clojure语言的经验,我相信可以提前告诉您问题是否会清楚地分解为可以用Clojure简洁而充分地(以性能术语表示)的部分,以及需要用Java完成的部分。

  • 您可以使用Scala精简版:在Scala中编写Java习惯用法。您将获得一些简洁,语法上更容易理解的内容以及连贯的复杂类型系统。
  • 没有Clojure lite这样的东西:用Clojure编写Java习惯用语完全没有意义。您将得到的是缓慢的Java,它很难理解,因为它切入了用来表达它的惯用语言。

据说Scala做Java是对的。Clojure与Java完全不同。您可能会说Lisp做对了-一个大胆的说法,有些人会说荒谬的说法-事实可能如此。


4
这个答案很好地说明了两者的真正区别和优势/劣势。它既不是以sc语或氯尿疗法专家的方式写的,而是以真实性的方式写的。
StephenBoesch 2015年

15

计算机语言基准游戏”产生的统计数据可能是您可能会发现的最佳数据。

它们是深入的,您可以比较多种语言。问题是他们没有涵盖Clojure :(

就是说,提交任何东西都很容易-全部都是开源的。

统计数据确实表明,Scala非常快。


9
妳去 比Java慢2-25倍,比内存慢2-30倍,并且代码大小通常比Java大。看起来它可以与Python相媲美,而Scala与Java非常接近。我想说Scala是一个非常明显的赢家,而Clojure的速度要慢得多-除非Clojure测试的书写不佳。
Bill K 2010年

2
基准似乎现在涵盖了Clojure(OP的评论已经有一年了)。结果并不令人鼓舞。Scala是必经之路。
马丁2010年

4
上面的评论有些过时了-截至2012年中期,Clojure大大缩小了差距,目前平均只有Java的2倍。
mikera

9

关于互操作性,我不能代表Clojure,但我希望它与Scala处于类似情况。

从Scala调用Java非常容易。

只要使外部API符合Scala和Java之间的共同点,就可以轻松地从Java调用Scala。例如,Scala对象以某种方式使用,例如Java中的静态方法,但这不是一回事。Scala类可以编译为许多类,这些类的名称在Java中看起来很有趣。

您将不会想混搭太多。在Scala或Clojure中使用大量Java库构建组件非常可行。您当然可以从Java调用此组件,但您不想做的是尝试使用打算由Java的Scala程序使用的Scala API。

SVN声称“ CVS做对了”。在我看来,Scala是Java完成的。


19
所以Clojure是git吗?
罗恩,

1
@罗恩哈哈,我想完全一样。
2011年

2
实际上的Clojure的集合是混帐十岁上下
乔·莱曼

2

PragPub的2010年11月问题讨论的Clojure,Java的互操作性。调用Java方法很简单,但是扩展Java类/接口却大不相同。

另一方面,Scala更接近Java。Scala-Java互操作性在http://www.codecommit.com/blog/java/interop-between-java-and-scala上进行了详细说明

调用Java代码和扩展Java类/接口的工作方式与调用Scala代码相同。某些痛点可能是处理Java泛型的一些极端情况,因为Scala的类型系统比Java强大得多。遵循Java Bean约定创建getter和setter时需要注释

在大多数情况下,从Java调用Scala很简单,但是例如,Scala的伴随对象需要知道如何将其编译为字节码。同样,将特征与Java的非抽象方法一起使用应该很复杂,并且调用带有特殊字符的方法将需要知道字节码中的编码方式。


1

现在(截至2010年5月)值得在Clojure的最新1.2分支中查找-这包括对原始类型和静态类型(通过各种类型提示和协议)的大量附加支持。

我的理解是,可以在需要时使用这些功能,以使其速度等同于用纯Java编写完全相同的代码。


2
同时,@specialized即将推出的Scala 2.8中的技术为Scala库带来了类似的改进。并且作为一种语言工具,它可以用于所有代码,而不仅仅是标准库。
兰德尔·舒尔茨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.