什么阻止Ruby,Python来获得Javascript V8的速度?

Gre*_*Dan 261 javascript ruby python performance language-design

是否存在阻止优化实现的Ruby/Python功能(例如内联缓存)V8引擎?

Python由Google员工共同开发,因此不应被软件专利阻止.

或者这是谷歌为V8项目投入资源的问题.

Jör*_*tag 519

什么阻止Ruby,Python来获得Javascript V8的速度?

没有.

好吧,好吧:钱.(和时间,人,资源,但如果你有钱,你可以买.)

V8拥有一支精干,高度专业化,经验丰富(因而又高薪)的工程师团队,他们在创建高性能执行方面拥有数十年的经验(我正在单独谈论 - 更像是几个世纪)动态OO语言的引擎.他们基本上也是创建Sun HotSpot JVM(以及其他许多人)的人.

首席开发人员Lars Bak已经在虚拟机上工作了25年(并且所有这些虚拟机都已经领先于V8),这基本上是他的整个(专业)生活.一些编写Ruby VM的人甚至还不到25岁.

是否存在阻止优化实现的Ruby/Python功能(例如内联缓存)V8引擎?

鉴于至少IronRuby,JRuby,MagLev,MacRuby和Rubinius都有单态(IronRuby)或多态内联缓存,答案显然是否定的.

现代Ruby实现已经进行了大量优化.例如,对于某些操作,Rubinius的Hash类比YARV快.现在,除非您意识到Rubinius的Hash类是用100%纯Ruby实现的,而YARV是在100%手动优化的C中实现的,所以这听起来并不令人兴奋.

所以,至少在某些情况下,Rubinius可以生成比GCC更好的代码!

或者这是谷歌为V8项目投入资源的问题.

是.不只是谷歌.V8的源代码现已有25年历史了.正在开发V8的人们还创建了自我虚拟机(迄今为止创建的最快的动态OO语言执行引擎之一),Animorphic Smalltalk虚拟机(迄今为止创建的最快的Smalltalk执行引擎之一),HotSpot JVM(有史以来最快的JVM,可能是最快的VM时期)和OOVM(有史以来最有效的Smalltalk VM之一).

事实上,V8的首席开发人员Lars Bak在其中每一个上工作,还有其他几个.

  • SpiderMonkey的性能相当,那么Mozilla是如何做到的呢?他们的钱非常有限.. (14认同)
  • @SalmanPK:这不是他们的第一个虚拟机,也有聪明的人在Mozilla工作. (8认同)
  • @SalmanPK,miguel:Mozilla至少部分通过逆向工程V8创建了他们的JS VM.https://blog.mozilla.org/dmandelin/2010/09/08/presenting-jagermonkey/ (3认同)
  • @Ian V8是开源的(BSD许可证),因此无需进行逆向工程,只需看看他们正在做什么. (2认同)

小智 78

高度优化JavaScript解释器的动力更大,这就是我们在Mozilla,Google和Microsoft之间看到如此多资源的原因.JavaScript必须实时下载,解析,编译和运行,而(通常是不耐烦的)人类正在等待它,它必须在一个人与之交互时运行,并且它在不受控制的客户端执行此操作环境可以是电脑,手机或烤面包机.为了有效地在这些条件下运行,它必须是有效的.

Python和Ruby在由开发人员/部署者控制的环境中运行.一个强大的服务器或桌面系统,通常限制因素是内存或磁盘I/O,而不是执行时间.或者可以使用缓存等非引擎优化的地方.对于这些语言,关注速度优化的语言和库特征集可能更有意义.

这样做的另一个好处是我们有两个高性能的开源JavaScript引擎,它们可以并且正在重新用于各种应用程序,例如Node.js.


Raf*_*ler 43

其中很大一部分与社区有关.Python和Ruby在很大程度上没有企业支持.没有人得到全职工作的Python和Ruby工作(他们特别是没有得到报酬,一直在CPython或MRI上工作).另一方面,V8由世界上最强大的IT公司提供支持.

此外,V8可以更快,因为对V8人来说唯一重要的是解释器 - 他们没有标准的库可以工作,不用担心语言设计.他们只是写口译员.而已.

它与知识产权法无关.Python也不是由人共同开发的(它的创建者和其他几个提交者一起工作,但他们没有得到报酬来使用Python).

Python速度的另一个障碍是Python 3.它的采用似乎是语言开发人员主要关注的问题 - 他们已经冻结了新语言功能的开发,直到其他实现赶上来.

关于技术细节,我对Ruby知之甚少,但是Python有很多可以使用优化的地方(Unladen Swallow,一个谷歌项目,在开始实施这些之前就开始实施这些).以下是他们计划的一些优化.如果为CPython实现JIT和PyPy,我可以看到Python在未来获得V8速度,但这似乎不太可能在未来几年(现在的焦点是Python 3的采用,而不是JIT).

许多人还认为Ruby和Python可以从删除各自的全局解释器锁中获益匪浅.

您还必须了解Python和Ruby都是比JS更重的语言 - 它们提供了更多的标准库,语言功能和结构.仅面向对象的类系统增加了很多重量(我认为这是一种很好的方式).我几乎认为Javascript是一种嵌入式语言,比如Lua(在很多方面,它们都是相似的).Ruby和Python具有更丰富的功能,而表达性通常会以速度为代价.

  • 实际上,自最近发布的Python 3.2以来,暂停了新功能. (3认同)
  • +1,但不会冻结新语言功能意味着有更多时间花在优化上? (2认同)
  • "仅面向对象的类系统增加了很大的重量" - 像V8这样的现代JavaScript虚拟机有类,它们只是隐含的.就像在Python中一样,您不必在JavaScript中显式键入变量,您不必显式键入类.VM非常聪明,可以通过您的代码并提取类. (2认同)

kin*_*all 24

性能似乎并不是核心Python开发人员的主要关注点,他们似乎认为"足够快"足够好,而且帮助程序员提高工作效率的功能比帮助计算机更快地运行代码的功能更重要.

然而,确实有一个(现在已经放弃的)谷歌项目,即unladen-swallow,用于生成与标准解释器兼容的更快的Python解释器.PyPy是另一个打算生成更快的Python的项目.还有Psyco,它是PyPy的先驱,可以在不改变整个解释器的情况下为许多Python脚本提供性能提升,还有Cython,它允许你使用非常类似Python语法的东西为Python编写高性能的C库.


Han*_*ver 13

误导性的问题.V8是JavaScript的JIT(即时编译器)实现,在其最流行的非浏览器实现Node.js中,它是围绕事件循环构建的.CPython不是JIT而且没有公平.但是这些存在于Python中最常见的PyPy项目 - 一个CPython 2.7(很快就会是3.0+)兼容的JIT.并且有大量的服务器库,例如Tornado.运行Tornado和Node.js的PyPy之间存在真实世界测试,性能差异很小.

  • +1提及[Tornado](http://www.tornadoweb.org/en/stable/).虽然它与Node.js的速度相当,但它的`gen.engine`模块与Python生成器和`yield`语句一起使用([自2.5 !!!](http://docs.python.org/release/2.5) .2/ref/yield.html)可以重新定义您的异步编码. (3认同)

小智 9

我刚刚遇到了这个问题,而且还没有提到性能差异的一个很大的技术原因.Python有一个非常庞大的强大软件扩展生态系统,但是大多数这些扩展都是用C或其他低级语言编写的,以提高性能并且与CPython API密切相关.

有许多众所周知的技术(JIT,现代垃圾收集器等)可用于加速CPython实现,但所有这些技术都需要对API进行大量更改,从而打破了流程中的大多数扩展.CPython会更快,但是很多让Python如此吸引人的东西(广泛的软件堆栈)会丢失.举个例子,有几个更快的Python实现,但与CPython相比它们没什么吸引力.


c-s*_*ile 9

由于不同的设计优先级和用例目标,我相信.

通常,脚本(aka动态)语言的主要目的是成为本机函数调用之间的"粘合剂".这些原生功能应a)覆盖大多数关键/常用区域,b)尽可能有效.

下面是一个示例: jQuery排序导致iOS Safari冻结 由于过度使用get-by-selector调用导致冻结.如果get-by-selector将在本机代码中实现,并且实际上根本不存在这样的问题.

考虑经常用于V8演示的ray-tracer演示.在Python世界中,它可以在本机代码中实现,因为Python为本机扩展提供了所有工具.但是在V8领域(客户端沙箱)中你没有其他选择,而不是让VM尽可能地[子]有效.因此,唯一的选择是使用脚本代码查看ray-tracer实现.

所以不同的优先事项和动机.

Sciter中,我通过本机实现几乎完整的jQurey核心进行了测试.在像ScIDE(由HTML/CSS/Script构成的IDE)这样的实际任务上,我相信这样的解决方案比任何VM优化都要好得多.


And*_*rea 5

正如其他人所提到的,Python有一个以PyPy形式的高性能JIT编译器.

制作有意义的基准测试总是很微妙,但我碰巧有一个用不同语言编写的K-means的简单基准- 你可以在这里找到它.其中一个限制是各种语言都应该实现相同的算法,并且应该努力简单和惯用(而不是针对速度进行优化).我已经写了所有的实现,所以我知道我没有作弊,虽然我不能声称我所写的所有语言都是惯用语(我只是对其中一些知识的传递知识).

我没有得到任何明确的结论,但PyPy是我得到的最快的实现之一,远远优于Node.相反,CPython排名最慢.


e-s*_*tis 5

声明并不完全正确

就像V8只是JS的一个实现一样,CPython只是Python的一个实现.Pypy的表演与V8相匹配.

此外,还有的感知性能问题:因为V8是本地无阻塞,web开发带来更多高性能的项目,因为你保存IO等待.V8主要用于IO是关键的开发Web,因此他们将它与类似的项目进行比较.但是你可以在很多很多其他领域使用Python而不是web dev.您甚至可以将C扩展用于许多任务,例如科学计算或加密,以及使用炽热的数据处理数据.

但是在网络上,大多数流行的Python和Ruby项目都是阻塞的.特别是Python拥有同步WSGI标准的遗产,而着名的Django等框架就是基于它的.

您可以编写异步Python(如Twisted,Tornado,gevent或asyncio)或Ruby.但它并不常见.最好的工具仍在阻止.

但是,它们是为什么Ruby和Python中的默认实现不如V8快的原因.

经验

就像JörgWMittag指出的那样,从事V8工作的人都是VM天才.Python是一群充满热情的人,在很多领域都非常出色,但在VM调优方面并不专业.

资源

Python软件基金会的资金很少:一年投资Python的资金不到4万美元.这是有点疯狂,当你认为大牌球员,如谷歌,Facebook和苹果都使用Python,但它是丑陋的真相:大部分的工作是免费的完成.在Java之前由Youtube提供支持并且由志愿者手工制作的语言.

他们是聪明而专注的志愿者,但当他们发现他们需要更多的果汁时,他们不能要求300k雇用这个专业领域的顶尖专家.他们不得不四处寻找能够免费使用它的人.

虽然这有效,但这意味着您必须非常小心您的优先事项.因此,现在我们需要看看:

目标

即使使用最新的现代功能,编写Javascript也很糟糕.你有范围问题,非常少的集合,可怕的字符串和数组操作,除了日期,数学和正则表达式之外几乎没有stdlist,甚至对于非常常见的操作也没有语法糖.

但是在V8中,你有速度.

这是因为速度是Google的主要目标,因为它是Chrome中页面呈现的瓶颈.

在Python中,可用性是主要目标.因为它几乎从不是项目的瓶颈.这里稀缺的资源是开发者时间.它针对开发人员进行了优化.