【问题标题】:What is the fastest language that runs on the JVM在 JVM 上运行最快的语言是什么
【发布时间】:2018-06-26 21:10:07
【问题描述】:

在 JVM 上运行速度最快的语言是什么?

斯卡拉?时髦? JRuby?

【问题讨论】:

  • 这不取决于你用它做什么吗?

标签: jvm performance


【解决方案1】:

http://benchmarksgame.alioth.debian.org/。 Java 非常快,Scala 几乎一样快。 JRuby 慢了 10-30 倍。 Groovy 是slow too

【讨论】:

  • 多么奇怪!文字上写着“shootout.alioth.debian.org”,但这不是链接带你去的地方......
  • "JRuby 慢了 10-30 倍" - 不用担心多核,基准测试游戏显示最快的慢 2 倍,最慢的慢 87 倍 shootout.alioth.debian.org/u32/…
  • @igouy:19 个月后,我终于修复了链接。 :-(
  • scala 代码似乎比 java 短很多。
  • 链接失效了,还有什么办法吗?
【解决方案2】:
【解决方案3】:

Java。

实际上,在大多数情况下,速度差异可以忽略不计。静态语言会比动态语言快,但不会快很多。

【讨论】:

【解决方案4】:

正如 Anthony 所说,Java 是最快的语言。

静态类型语言(Java、Scala)比动态类型语言(Groovy、JRuby)更快。

【讨论】:

    【解决方案5】:

    您必须小心比较的内容。 除了其他人提到的“这取决于你用它做什么”之外,它还取决于如何你这样做。

    例如,像 Scala 这样的语言可以让您自然地表达在 Java 中可能需要更长时间才能完成的习语和算法。这并不是说你不能在做同样的事情时与 Scala 的表现相匹敌——只是在一种语言中匹配另一种语言中的自然习语可能会成为一种丑陋的解决方法(注意我并不是说我相信 Scala 实际上比Java 在任何方面——我没有这方面的数据——除了 Scala 在设计时考虑到了可扩展性——因此得名)。

    换句话说,性能通常与算法有关,而算法的选择通常与表达的难易程度有关。所以“为工作使用正确的工具”在这里适用——无论该工具碰巧是 Java、Scala、JRuby 还是其他任何工具(尽管我怀疑在任何情况下动态语言都比静态语言快而不是病态的)。

    当然,我们也可以在优化等之前讨论分析,但这并不能直接解决问题。

    【讨论】:

    • “Scala 在设计时考虑到了可扩展性——因此得名”我不认为这就是他们所说的可扩展性,他们的意思是“概念可以很好地扩展到大型程序”scala-lang.org/node/250
    • 我认为这是一个过度使用的术语,但肯定是在暗示并行处理。通过更容易编写并发应用程序,它们可以更好地扩展——即使每条指令它们相同或更慢,这种总体性能也可以提高。当然,这并不是对所有类型的问题都有用。
    • “肯定是在暗示并行处理”——在你的脑海中,但他们在哪里将其与名称联系起来?
    • 好问题。刚查了一下,没有我记得的那么清楚。但是,如果您查看 scala-lang.org/node/25 并阅读“Scala 的概念”部分,您会发现该语言的主要目标是架构可伸缩性。如果我找到一个清晰、权威的引用,将其链接回我将在此处更新的名称。但与此同时,你赢了这一轮;-)
    【解决方案6】:

    答案:bash !?

    这可能不是问题的直接答案,但如果“快速”与启动时间有关,那么 bashj(支持 java 的 bash,https://sourceforge.net/projects/bashj/)提供了极好的启动时间。下面是来自 java、bash 和 bashj 的“Hello World”的比较。 bashj 版本使用一个隐藏的 JVM 服务器,调用它来显示 msg。

                  minimum (msec)    median (msec)
    bash               2                  6
    bashj              7                 11
    java              72                 80
    

    使用 bashj 从其 main() 入口点执行 java 程序比使用 java 本身更快!

    这里是bashj源代码:

    #!/usr/bin/bashj
    #!java
    static void hello() {System.out.println("Hello, world !");}
    
    #!bashj
    j.hello()
    

    对于一般的java方法调用,bashj时间是JVM执行时间加上~1msec

    【讨论】:

    • bashj 对我来说是新的。很有趣。
    【解决方案7】:

    我认为这取决于您所说的更快是什么意思,以及语言为性能而编写的好坏。

    例如,如果您正在做一些数学密集型的事情,那么 Scala 会比 Java 快。

    但是,如果你避免在 java 中使用慢的函数并在所有有意义的地方使用 final,你可以让 Java 比 Scala 运行得更快,据我最近在一次采访中被告知。

    因此,这是一个很难笼统地回答的问题,因为人们会展示 Scala 或 Java 更快的实例。

    但是,如果您不使用vars,而是使用val,我相信Scala 通常会更快。

    【讨论】:

    • “例如,如果你正在做一些数学密集型的事情,那么 Scala 会比 Java 更快”——你能证明这是真的吗?
    • 我可以,但是需要一段时间,但是由于Scala的设计,如果你有一个容易并行处理的问题,比如有限元数学,那么Scala会更快由于利用了函数式编程方面的优势,但是,正如我所提到的,您可以提出论据来表明,这取决于问题以及每种语言的编写情况。
    • “如果你有一个很容易并行解决的问题”——比如光谱范数? shootout.alioth.debian.org/u32q/…
    • 我们正在使用 Java 进行性能计算。我们考虑过 Scala,但它真的很慢。使用 Scala 和“原语数组”(您希望在 Scala 生成的 Java 字节码中使用它)获得高性能的唯一方法是使用单态 Scala 数组。它们还不错,但是您必须为地图、投影等付出高昂的代价。这在高性能计算中是禁忌的。正如您在下一段中所写的那样:正确完成 Java 更快。 特别是对于数学密集型的东西。如果你知道怎么做的话,在 Java 中进行并行化是非常高效的。
    • 很难用Java写出好的多线程代码,但是由于Scala是编译成Java的,Java会更快是有道理的,但是函数式编程的想法可以在这方面有所帮助,例如,具有供线程使用的不可变变量。如果问题空间通过函数式编程更好地建模,Scala 的解决方案可能更容易实现、更自然,但重要的是要了解工具的局限性并根据团队的技能和限制来决定哪种工具最有效。
    【解决方案8】:

    任何编译成字节码的语言都可以在带有 JIT 的 JVM 上以同样快的速度运行。

    【讨论】:

    • groovy 和 ruby​​ 对反射的大量使用使得它们比普通的 java 慢。但根据 JSR-292(jcp.org/en/jsr/detail?id=292),java 7 应该会变得更好。
    • 据我所知,JRuby 是一个解释器,因此 Ruby 代码不会被编译成字节码。 JIT 不适应一些额外的工作吗?
    • 嗯,这取决于语言编译成的哪个字节码。一些语言产生比其他语言更好的优化字节码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2011-04-09
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多