4

与 C/Java 相比,在许多情况下,是否可以设计 Ruby 或 Clojure 之类的东西而不会造成明显的性能损失?硬件设计是否起作用?

编辑:我的意思是一个数量级,而不仅仅是十个百分点

编辑:我怀疑 delnan 对我的意思是动态语言是正确的,所以我更改了标题

4

5 回答 5

8

性能取决于很多事情。当然,即使我们正在编译该语言的语义,也必须保留它——你不能从 Ruby 中删除动态调度,它会大大加快速度,但它会完全破坏世界上 95% 的 Ruby 代码。但是,大部分性能取决于实现的智能程度。

我认为,“高级”是指“动态”?Haskell 和 OCaml 是非常高级的,但它们是本机编译的,并且在某些极端情况下甚至可以胜过 C# 或 Java,甚至是 C 和 C++——尤其是在并行性发挥作用的情况下。而且它们的设计当然没有将性能作为第一目标。但是编译器作者,尤其是那些专注于函数式语言的人,是一个非常聪明的人。如果你或我开始使用高级语言,即使我们使用 LLVM 作为本机编译的后端,我们也不会获得接近这种性能的任何地方。

让动态语言快速运行更难——它们将许多决策(类型、类/对象的成员……)延迟到运行时而不是编译时,虽然静态代码分析有时可以证明在第 n 行和第 m 行中是不可能的,您仍然必须携带高级运行时并执行静态语言的编译器可以在编译时执行的很多事情。甚至动态调度也可以使用更智能的 VM(有人说是内联缓存吗?)进行优化,但工作量很大。就是说,这不仅仅是一种小型的新语言所能做的。

另请参阅Steve Yegge 的 Dynamic Languages Strike Back

当然,什么是显着的性能损失?比 C 读慢 100 倍很多,但众所周知,80% 的执行时间花在 20% 的代码上 = 80% 的代码不会对整个程序的感知性能产生显着影响。对于剩下的 20%,你总是可以用 C 或 C++ 重写它并从动态语言中调用它。对于许多应用程序来说,这就足够了(对于某些应用程序,您甚至不需要优化)。其余的……好吧,如果性能如此关键,您应该适当地用专为性能设计的语言编写它。

于 2010-09-18T10:55:30.643 回答
1

不要将语言设计与其运行的平台混淆。

例如,Java 是一种高级语言。它在 JVM 上运行(正如 Clojure - 上面提到的,以及 JRuby - Ruby 的 Java 版本)。JVM 将执行字节码分析并优化代码的运行方式(利用转义分析、即时编译等)。因此,平台对性能的影响很大程度上与语言本身无关(有关 Java 性能和与 C/C++ 比较的更多信息,请参见此处)

于 2010-09-18T09:20:38.867 回答
1

损失相比什么?如果你需要一个垃圾收集器或闭包,那么你就需要它们,无论如何你都要付出代价。如果一种语言让你很容易理解它们,那并不意味着你必须在不需要它们时使用它们。

如果一种语言被解释而不是编译,那将引入一个数量级的减速。但这样的语言可能具有补偿性优势,例如易用性、平台独立性以及无需编译。而且,您在其中编写的程序可能运行时间不够长,以至于速度成为问题。

可能有一些语言实现会无缘无故地引入缓慢,但不一定要使用这些实现。

于 2010-09-18T12:56:45.030 回答
0

这当然是可能的。例如,Objective-C 是一种动态类型语言,其性能可与 C++ 媲美(虽然一般来说稍慢一点,但仍大致相当)。

于 2010-09-18T15:36:46.027 回答
0

您可能想看看 DARPA HPCS计划提出了什么。提出了 3 种编程语言:Sun 的 Fortress、IBM 的 X10 和 Cray 的 Chapel。后两者仍在开发中。我不知道这些是否符合您对高级别的定义。

是的,硬件设计确实发挥了作用。所有这 3 种语言都针对具有非常多处理器的超级计算机,并具有适合该领域的特性。

于 2010-09-18T13:43:00.223 回答