什么是在JVM上运行最快的编程语言?

7

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

Scala?Groovy?JRuby?


6
这不取决于你用它做什么吗? - Nick Haslam
7个回答

14

2

Java.

但是,就大部分情况而言,速度差异将是微不足道的。静态语言比动态语言更快,但差别不大。


1

答案:bash !?

这可能不是对问题的直接回答,但如果“快速”与启动时间有关,则支持Java的bashj(带有Java支持的bash,https://sourceforge.net/projects/bashj/)提供出色的启动时间。以下是Java、bash和bashj的“Hello World”的比较。bashj版本使用一个隐藏的JVM服务器来显示消息。

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

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

以下是bashj源代码:

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

#!bashj
j.hello()

对于一般的Java方法调用,bashj时间是JVM执行时间加上约1毫秒。


bashj 对我来说是新的。有趣。 - Thufir

1

就像Anthony所说,Java是最快的编程语言。

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


1

在比较时要小心。除了其他人提到的“这取决于你用它做什么”的因素外,还取决于你如何去做。

例如,像Scala这样的语言可以让你自然地表达习惯用语和算法,而在Java中可能需要更长的方式来实现。这并不是说你不能在做同样的事情时与Scala的性能相匹配 - 只是在一种语言中为了匹配另一种语言的自然习惯而变成了一个丑陋的解决方法(请注意,我并不是说我相信Scala在任何特定方面都比Java快 - 我没有相关数据 - 除了Scala是以可扩展性为设计目标的 - 因此得名)。

换句话说,性能通常与算法有关,而选择算法通常与表达的简便性有关。因此,“使用正确的工具完成工作”适用于此处 - 无论该工具是否为Java、Scala、JRuby或其他语言(尽管我怀疑在没有病态情况下,动态语言比静态语言更快的情况几乎不存在)。

当然,我们也可以谈论优化前的分析等,但这并没有直接回答问题。


Scala的设计考虑到了可扩展性——因此得名。我认为他们所说的可扩展性并不是指“概念在大型程序中具有可扩展性”。http://www.scala-lang.org/node/250 - igouy
我认为这是一个负载过重的术语,但其中肯定有对并行处理的暗示。通过简化编写并发应用程序的过程,它们可以更好地扩展 - 即使每个指令相同或更慢,总体性能也会提高。 当然,这对于所有类型的问题都不是有用的。 - philsquared
在你的脑海中肯定有一个并行处理的暗示,但是他们把它和名字联系起来了吗? - igouy
好问题。我刚刚检查了一下,发现它没有像我记得的那样清晰地表述出来。然而,如果你看一下scala-lang.org/node/25并阅读“Scala的概念”部分,你会发现这门语言的设计初衷是实现架构可扩展性。如果我找到一个明确、权威的引用,将其与名称联系起来,我会在这里更新。但在此期间,你赢了这一轮;-) - philsquared

-1

我认为这取决于您所说的“更快”的含义,以及语言编写性能的好坏。

例如,如果您正在进行数学密集型任务,则Scala比Java更快。

但是,如果您避免在Java中使用速度较慢的函数,并在所有适当的位置使用final,根据我最近在面试中听到的内容,您可以使Java运行得比Scala更快。

因此,这是一个难以一般化回答的问题,因为人们会展示Scala或Java更快的实例。

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


例如,如果您正在进行数学密集型的操作,则Scala比Java更快。您能证明这是真的吗? - igouy
我可以翻译,但需要一些时间。由于Scala的设计,如果您遇到易于并行处理的问题(例如有限元数学),Scala将更快,因为它利用了函数式编程方面的优势。但是,正如我之前提到的,您可以提出论据来证明任何一种语言更好,这取决于问题本身以及每种语言的编写质量。 - James Black
如果您遇到一个容易并行处理的问题,比如谱范数(spectral-norm)?http://shootout.alioth.debian.org/u32q/benchmark.php?test=spectralnorm&lang=scala&id=2 - igouy
1
我们正在使用Java进行性能计算。我们考虑过Scala,但它非常慢。要在Scala中获得高性能并使用“原始数组”(您希望在Scala生成的Java字节码中看到该内容),唯一的方法是使用单态Scala数组。它们还可以,但是您必须为映射、投影等付出装箱代价,这在高性能计算中是不可行的。就像你在下一个段落中所写的一样:正确使用Java更快。特别是对于数学密集型任务。如果您知道如何并行化Java,那么性能很高。 - SyntaxT3rr0r
在Java中编写良好的多线程代码很困难,但由于Scala编译为Java,因此Java会更快,但是函数式编程的思想可以对此有所帮助,例如为线程使用不可变变量。如果问题空间更适合函数式编程,则Scala的解决方案可能更容易实现、更自然,但重要的是要了解工具的限制,并根据团队的技能和约束条件决定哪种方法最有效。 - James Black

-2
任何可以编译成字节码的语言在具备JIT功能的JVM上运行速度都是一样快的。

6
使用大量反射机制的Groovy和Ruby相比纯Java会变慢。但根据JSR-292(http://jcp.org/en/jsr/detail?id=292),在Java 7中应该会有所改善。 - vdr
据我所知,JRuby是一种解释器,因此Ruby代码不会被编译为字节码。难道JIT不能适应一些额外的工作吗? - Michael Dillon
提炼JRuby: JIT编译器 http://www.realjenius.com/2009/10/06/distilling-jruby-the-jit-compiler/ - igouy
1
嗯,这取决于编程语言编译成哪种字节码。有些语言生成的字节码比其他语言更优化。 - mikera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接