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

Rya*_*chi 82 java performance jvm scala clojure

我已经阅读过Clojure与Scala的各种报道,而我发现两者都有自己的位置.有一些考虑因素我没有得到关于何时比较Clojure和Scala的完整解释:

1.)这两种语言中的哪一种通常更快?我意识到这会因语言功能而异,但对性能的一般评估会有所帮助.例如:我知道Python字典非常快.但作为一个整体,它是一个比Java慢语.我不想和Clojure一起走在路上遇到这个问题.

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

最终,如果它在clojure和scala之间足够接近,我可能会尝试它们.关于Clojure的一件事是语言看起来简单.但话说回来,Scala有一个非常灵活的类型系统.但是,我知道Scala很快(基于多个个人帐户).所以,如果Clojure明显变慢了:我想早点知道,而不是迟早.

Dig*_*oss 73

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

与Clojure相比,Scala具有一些实现优势,我期望性能更高一些.虽然Scala的静态类型通常会转化为速度优于Clojure的鸭子类型,但Clojure 确实支持类型提示,这可以大大加快代码速度.可能普通的Scala比普通的Clojure更快,但你只需要优化瓶颈.大多数程序的运行时间是由少量的实际代码生成的.

关于使用Java的互操作,Scala更接近Java,但我确信两种语言的互操作性都很好.在编程Clojure中, Stuart Halloway写道:"[你可以访问] 从Java代码中可以获得的任何东西. "

由于Scala的作者Martin Odersky 编写了 Sun的Java编译器,我认为Scala方面也没有丢弃任何球.:-)

你会很难选择两种更好的语言,尽管我也喜欢Ruby.你为什么担心要尝试哪一个?为什么不尝试两者?Scala更有可能成为"下一个Java",而很难想象Lisp将在50多年没有这样做之后终于起飞.但很明显Lisp处于自己独特的抽象层次,而Clojure相当简单,因此Scala + Clojure不会比(相当复杂的)Scala那么难,我相信你会很高兴你做到了它.

就此而言,他们可以互操作......

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

  • 在JVM中编写的语言将以最快的速度执行并不总是正确的.最初的JRuby具有糟糕的性能,因为它是一个编译为JVM的解释器,而不是源代码.这种语言也可能是罪魁祸首.静态类型语言通常比动态语言等更容易优化. (8认同)
  • 而且我想补充一点,我确实对LISP有一点"情有独钟",所以Clojure患有牙龈炎的事实并不足以吓跑我. (7认同)
  • -1"Scala和Clojure都是JVM语言,因此它们应具有相似的性能"这绝对没有意义.需要与Java等静态语言保持互操作的动态语言*总是慢得多(重载成本很高,类型提示并不能解决所有问题等) (7认同)
  • 呵呵.好的,感谢所有的见解.起初,我处于这样的模式,我只想选择一个并运行它.但出于某种原因,我并没有想到我可以只使用它们并让它们相互操作.所以,也许我会选择两者并与他们一起快走:-) (6认同)
  • @julkiewicz - 动态语言总是*慢得多,这根本不是真的.这取决于您的编译器是否可以在优化相关代码方面做得不错.例如,在Clojure中,您可以使用与Java性能完全匹配的Java原语进行算术运算.同样,在类型提示的Java对象上调用方法与Java对象方法调用一样快.Clojure编译器基本上生成与javac相同的字节码,用于等效的Java代码. (4认同)
  • -1"Scala和Clojure都是JVM语言,因此它们应具有相似的性能"这绝对没有意义. (2认同)

Dan*_*ral 32

使用现有的JVM Scala在静态类型的帐户上具有优势,因为JVM支持动态类型 - 反射 - 很慢.实际上,由于这个原因,必须通过相同的技术,结构类型实现一个Scala特性.

此外,Scala接受可变对象就好了,而且一些算法只需更快地实现可变性.

由于Scala和Java本质上都是基于类的语言,因此它们更容易互操作.或者,也许更无缝.Java类是Scala的类,Scala类是Java的类.当涉及Scala的单身人士或Java的静态成员时,可能会出现问题,特别是当有一个框架涉及期望事物以某种方式工作时.

所以我会在这两个帐户上使用Scala .从很多方面来说,Clojure是一种更好的语言,它当然具有Scala上没有的(目前为止)非常有趣的功能,但是你可以通过完全功能获得这些好处.如果你打算这样做,那么Clojure很可能会更好.如果你不这样做,那么你应该继续使用Scala.

  • clojure的函数式编程功能是我考虑这种语言的最有说服力的原因.我已经达到了这样的程度:如果我没有以功能方式编写代码 - 为什么我还要使用Java中嵌入的脚本语言呢?我已经在我身边使用Python来完成快速而肮脏的任务. (9认同)
  • 然后去Clojure. (9认同)

Jes*_*per 21

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

在我看来,语言的功能和概念(功能,OO,......)是选择语言的重要标准,而不是表现(该语言的特定实现)的表现 - 尽管我知道你没有希望陷入一种没有良好实施可用性的语言.

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

  • Clojure中存在与Java的互操作性,但类和对象显然不是Clojure的主要特性.如果要在Clojure中编程,则不要以OO方式创建类和设计项目. (28认同)
  • 显然你还没有使用过Clojure.Clojure就像Scala是Functional一样面向对象.您可以实现接口,扩展类,声明私有和静态函数等(http://clojure.org/java_interop). (9认同)

Thu*_*ail 16

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

如果您的代码在时间要求严格或对空间至关重要,请坚持使用Java.但即便如此,它也不是.

计算机语言基准游戏揭示了Clojure的真实资源成本小光.没有采用Clojure数据结构.功能和序列抽象不会出现.

Clojure似乎很简单.它不是,但它富有表现力.它的运行速度可能比Java快五倍,但源的数量要小五倍(YMMV).对于大多数应用程序来说,这是一个巨大的胜利.但是对于一些人而言,对于其他许多人来说,这是一种毁灭性的损失.

凭借Clojure语言的经验,我相信有可能事先告诉你的问题是否会完全切割成一个可以简洁而充分地(在性能方面)用Clojure表达的部分以及需要用Java做的部分.

  • 你可以去Scala lite:在Scala中编写Java习语.你将获得一些简洁,一种在眼睛上更容易的语法,以及一个连贯的复杂类型系统.
  • 没有Clojure lite这样的东西:在Clojure中编写Java习语是完全没有意义的.所有你得到的都是缓慢的Java,这很难理解,因为它跨越了用来表达它的习语.

据说Scala 是正确的Java.Clojure与Java完全不同.你可能会说它是正确的Lisp - 一个大胆的,有些人会说荒谬,声称 - 这可能证明是真的.

  • 这个答案很好地阐明了两者的真正差异和优势/劣势.它不是用scala-或clojure-apologist方式写的,而是用真实的方式写的. (4认同)

Bil*_*l K 15

" 计算机语言基准游戏 " 产生的统计数据是您可能会找到的最佳数据.

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

也就是说,提交任何东西都很容易 - 它都是开源的.

统计数据确实说Scala非常快.

  • 你去吧 比Java慢2-25倍,内存和代码大小增加2-30倍通常比Java大.看起来它与Python相当,而Scala与Java非常接近.我说Scala是一个相当明显的赢家,Clojure明显更慢 - 除非Clojure测试写得不好. (9认同)
  • 上面的评论有些过时 - 截至2012年中期,Clojure已经大幅缩小了差距,现在平均只有约2倍的Java. (4认同)
  • 似乎基准确实涵盖了Clojure(OP的评论是一年之久).结果并不令人鼓舞.Scala是要走的路. (2认同)

Kev*_*son 9

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

从Scala调用Java非常容易.

只要您将外部API与Scala和Java之间的公共点相符合,就可以轻松地从Java调用Scala.例如,Scala对象在某些方面用于Java中的静态方法,但它不是一回事.Scala类可以编译为许多类,其名称在Java中看起来很有趣.

你不会想要混合搭配.在Scala或Clojure中构建使用大量Java库的组件是非常可行的.您当然可以从Java调用此组件,但您不想要做的是尝试使用Scala API以供Java中的Scala程序使用.

SVN声称"CVS做对了".在我看来,Scala是Java完成的.

  • 所以clojure是git? (19认同)
  • 实际上Clojure的集合是git-ish (2认同)