动态语言是否比静态语言慢,因为例如,运行时必须一致地检查类型?
答案 0 :(得分:52)
没有
动态语言并不比静态语言慢。实际上,任何语言(动态或非动态)都不可能比另一种语言慢(或者更快,就此而言),因为语言只是一堆抽象的数学规则。你不能执行一堆抽象的数学规则,因此它们永远不会慢(呃)或快(呃)。
“动态语言比静态语言慢”的说法不仅错误,它甚至不会使有意义。如果英语是一种打字语言,那么这句话甚至都不会出现问题。
为了使语言能够运行,必须首先实现。 现在您可以衡量性能但您没有衡量语言的性能,您正在衡量执行的性能发动机。大多数语言都有许多不同的执行引擎,具有非常不同的性能特征例如,对于C,最快和最慢实现之间的差异是100000左右!
此外,您无法真正衡量执行引擎的性能:您必须首先在该执行引擎上编写一些代码到运行。但是现在您没有测量执行引擎的性能,您正在测量基准代码的性能。这与执行引擎的性能关系不大,当然与语言的性能无关。
通常,在设计良好的高性能执行引擎上运行设计良好的代码将产生大致相同的性能,无论语言是静态还是动态,过程,面向对象或功能,命令式还是声明式,懒惰或严格的,纯粹的或不纯的。
事实上,我建议系统的性能完全取决于花在快速上的金额,而且完全独立于任何特定的打字规则,编程范式或语言。
以Smalltalk,Lisp,Java和C ++为例。所有这些都是,或者曾经一直是高性能代码的首选 语言。他们所有人都有大量的工程和研究人员,他们花了很多时间来加快他们的速度。所有这些都具有高度调整的专有商业高性能执行引擎。鉴于大致相同的问题,由大致相当的开发人员实施,它们的表现大致相同。
其中两种语言是动态的,两种是静态的。 Java很有趣,因为虽然它是一种静态语言,但大多数现代高性能实现实际上都是动态实现。 (事实上,几个现代高性能JVM实际上是伪装的Smalltalk VM,源自Smalltalk VM或由Smalltalk VM公司编写。)Lisp也很有趣,因为虽然它是一种动态语言,但也有一些(尽管不是很多) )静态高性能实现。
我们甚至还没有开始谈论执行环境的 rest :现代主流操作系统,主流CPU和主流硬件架构都严重偏向于静态语言,以至于积极主动对动态语言充满敌意。鉴于现代主流执行环境几乎是动态语言的最坏情况,它们的实际表现非常令人惊讶,人们只能想象在不太恶劣的环境中表现的样子。
答案 1 :(得分:16)
所有其他事情都是平等的,通常是的。
答案 2 :(得分:16)
首先,您必须澄清是否考虑
通常我们的意思是
,但没有必要这样做。
类型信息可以帮助VM更快地调度消息,而不是类型信息,但是在检测单态呼叫站点的VM中优化时,差异往往会消失。请参阅此post about dynamic invokation中的“效果考虑”一节。
编译与解释与字节码JIT之间的争论仍然存在。有人认为字节码JIT比常规编译更快地执行,因为由于在运行时收集了更多信息,编译更准确。阅读wikipedia entry about JIT以获取更多信息。解释语言确实比两种形式或编译中的任何一种都慢。
我不会进一步争论,并开始激烈的讨论,我只想指出两者之间的差距往往越来越小。您可能遇到的性能问题可能与语言和VM无关,但可能与您的设计有关。
修改强>
如果您想要数字,我建议您查看The Computer Language Benchmarks。我发现它很有见地。
答案 3 :(得分:5)
在指令级,动态类型语言的当前实现通常比静态类型语言的当前实现慢。
然而,这并不一定意味着程序的实现在动态语言中会变慢 - 有许多记录在案的同一程序的案例都以静态和动态语言实现,动态实现已证明是快点。例如,this study (PDF)给各种语言的程序员带来了同样的问题,并对结果进行了比较。 Python和Perl实现的平均运行时间比C ++和Java实现的平均运行时更快。
有几个原因:
1)可以使用动态语言更快地实现代码,从而为优化留出更多时间。
2)高级数据结构(地图,集等)是大多数动态语言的核心部分,因此更有可能被使用。由于它们是语言的核心,因此它们往往得到高度优化。
3)程序员技能比语言速度更重要 - 没有经验的程序员可以用任何语言编写慢速代码。在上面提到的研究中,每种语言中最快和最慢的实现之间存在几个数量级的差异。4)在许多问题域中,执行速度由I / O或语言外部的其他因素支配。
5)算法选择可以使语言选择相形见绌。在“More Programming Pearls”一书中,Jon Bentley为一个问题实现了两种算法 - 一种是O(N ^ 3),并在Cray1上以优化的fortran实现。另一个是O(N)并在BASIC上用TRS80家用微型机实现(这是在20世纪80年代)。对于N> 1,TRS80的性能优于Cray 1。 5000。
答案 4 :(得分:3)
不,动态语言不一定比静态语言慢。
pypy和psyco项目在构建具有数据驱动编译的python的JIT编译器方面取得了很大进展。换句话说,它们将自动编译专门用于特定参数的常见值的常用函数的版本。不仅仅是类型,比如C ++模板,还有实际的参数值;假设一个参数通常为零,或者为None,那么该值的函数将有一个专门编译的版本。
这可能导致编译的代码比从C ++编译器中获得的代码更快,并且由于它在运行时执行此操作,因此它可以专门针对此特定程序实例的实际输入数据发现优化。
答案 5 :(得分:3)
最重要的因素是考虑方法调度算法。对于静态语言,通常为每个方法分配一个索引。我们在源代码中看到的名称实际上并未在运行时使用,并且在源代码中用于可读性目的。当然,像java这样的语言会保留它们并使它们在反射中可用,但是在调用方法时它们不会被使用。我将在讨论中留下反思和约束力。这意味着当调用方法时,runtmne只使用偏移量来查找表并调用。另一方面,动态语言使用函数的名称来查找映射,然后调用所述函数。散列映射总是比使用索引查找到数组要慢。
答案 6 :(得分:2)
动态语言运行时只需要偶尔检查类型。
但它通常仍然较慢。
然而,有人声称这种性能差距是可以攻击的;例如http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html
答案 7 :(得分:0)
合理假设因为需要在运行时计算更多的东西。
答案 8 :(得分:0)
实际上,很难说,因为使用的许多基准都不具有代表性。随着更复杂的执行环境(如HotSpot JVM),差异变得越来越不相关。看看下面的文章:
Java theory and practice: Dynamic compilation and performance measurement