DeltaBlue基准测试显示 Dart2js生成的JavaScript代码优于手写代码

Google发布了新版Dart2js编译器DeltaBlue基准测试(用 于测试面向对象语言的常用基准测试程序)显示,该编译器生成的JavaScript代码优于手写代码。尽管Dart2js项目从未以此为目标,但是它所应 用的各种优化,如内联(inlining)和预先计算(pre-computation)等,使某些Dart程序跑得比语义等价的地道 JavaScript代码还快。Dart网站还发布了Richards基准测试的结果,然而它的数据就是缓慢收敛的了,在这种基准测试程序下,Dart生成的JavaScript代码仍然比手写的代码慢26%。

下图显示了Dart在DeltaBlue基准测试程序上性能随时间演进的情况:

图中紫色的线代表Dart2js生成的JavaScript代码在Google v8 JavaScript引擎上的运行情况,黄线代表语义等价的地道JavaScript代码在v8上的运行情况。最上面的蓝线代表的是Dart代码在原生Dart虚拟机上的运行情况。数值越高表示性能越好。

Dart是Google为开发大规模Web应用程序而设计的新编程语言,可以运行在如下各种环境中:

  1. 运行在嵌入了Dart虚拟机的浏览器中。因为Dart项目尚未发布1.0版本,所以除了“Dartium”这一Chromium构建版本提供了Dart SDK之外,还没有哪个浏览器嵌入Dart虚拟机。
  2. 在服务器端,运行于Dart虚拟机中。dart:io库只能用于服务器端应用,它提供了用于访问文件系统和进程管理信息、以及用于构建服务器(比如HTTP服务器或WebSocket服务器)的API。这就使Dart可用于与Node.js类似的场景,而且从前端到后端的应用开发都可以使用Dart。
  3. 嵌入在应用程序中运行。Dart虚拟机可用嵌入在任何C/C++应用程序中,从而支持Dart应用。
  4. 编译为JavaScript代码,运行在任何现代浏览器中。目前还没有哪个产品级浏览器支持 Dart,除了Chrome外,是否有浏览器准备嵌入Dart虚拟机还不得而知。不过利用Dart2js编译器将Dart程序编译为JavaScript 代码,仍然能够在各种浏览器中运行Dart应用。因此,Dart能否成功,生成的JavaScript代码的性能至关重要。

新的Dart2js编译器本身就是用Dart实现的,为了收集变量和参数将使用类型的更多信息,它使用了一种名为“全局类型推导(global type inferencing)” 的技术。因此可以生成更紧凑、更快速的JavaScript代码。有趣的是,Dart2js并没有使用Dart所支持的可选类型标注。这是因为运行时并没 有这些类型信息。除非Dart运行于检查模式(checked mode),这时如果破坏了类型约束,Dart会报错。因此像String name = 10;这样的语句,尽管让人迷惑不解,却是完全合法的。为确保所生成代码的正确性,Dart2js编译器完全忽略了类型标注。

因为Dart不像JavaScript那么自由,因而有可能进行很多新的优化。比如,在JavaScript中,可以动态向对象中添加方法,可以替 换方法,可以动态下载代码,还可以使用eval和with语句,这极大限制了像v8这样的JavaScript引擎可以执行的优化。这些功能中有很多 Dart都不支持,因此Dart2js在执行时可以精确地知道哪些代码会运行。它能够消除输出中用不到的代码,该过程称为死代码消除或tree shaking。某些情况下,它还可以内联代码,因为不同于JavaScript,Dart不支持动态修改(monkey patching)对象。

尽管我们不应轻相任何基准测试,但看看Dart团队如何不断改进性能数据也是很有趣的。虽然Dart还处于积极的开发之中,不过已经开始有厂家将其应用于产品中了。对于今天有兴趣在网络上部署Dart代码的任何人而言,Dart2js所生成代码的性能和体积都非常重要。

转载于:https://www.cnblogs.com/kuaidianba/archive/2013/04/12/3015839.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值