dart2js 代码如何比 javascript 更快?

Posted

技术标签:

【中文标题】dart2js 代码如何比 javascript 更快?【英文标题】:How is dart2js code faster than javascript? 【发布时间】:2014-01-22 15:58:21 【问题描述】:

我试图更好地了解飞镖对性能的影响。在dart website 上,他们的基准测试表明编译为 javascript 的 Dart 代码比仅使用 Javascript 更快。这怎么可能?

我了解 Dart VM 比 v8 更快,但我不明白 dart2js 生成的 javascript 比普通旧 javascript 更快,当两者都在相同的环境中运行时,v8。

【问题讨论】:

因为它可以使用你不知道或懒得做的优化。 【参考方案1】:

飞镖团队的 Vyacheslav Egorov 做了一场精彩的演讲,他详细解释了一些优化,包括衬里..

http://www.infoq.com/presentations/dart-compiler

总结 Vyacheslav Egorov 详细介绍了 Dart 的一些语言特性如何影响新 JIT Dart 编译器的设计以及 V8 如何 JavaScript 引擎影响了整体设计。

【讨论】:

这个视频是关于 Dart VM 和 V8,而不是 Dart2js。这是一个有趣的视频,但与问题不太相关。【参考方案2】:

Seth Ladd 和 Kasper Lund 有一个 interesting video。 Kasper 参与了 Dart2js 编译器的创建,并提供了一些关于编译器如何优化 Javascript 代码的代码示例。

【讨论】:

视频的相关部分大约在 7:30 开始。 这里有该演示文稿的 Dart2js 部分的扩展版本:youtu.be/GwBb_nqQLuc【参考方案3】:

一个例子是函数内联。如果您需要重复调​​用的代码片段,您可以在函数/方法中重构它。 Dart2js 经常做相反的事情。方法调用通常被调用的函数/方法包含的代码片段替换,这称为内联。如果您手动执行此操作,这将导致无法维护的代码。

我认为许多优化都是朝着这个方向发展的。 以这种方式编写代码将是不可读的,因此无法维护。 这并不意味着它是草率的。

【讨论】:

现代运行时和 JIT 很乐意这样做。 @BenjaminGruenbaum 是的,但提前完成的事实不会节省 JIT/运行时的工作吗? 这只是一个简单的例子。我不喜欢编译器优化,但 Dart 团队的一些成员喜欢。所有相关方都在不断地进行优化,这将反复导致 dart2js 所做的优化变得过时的情况,因为 JS VM 已经这样做了。越多的人致力于突破极限,我们就会获得更好的技术。【参考方案4】:

dart2js 能够执行通常不会在 JavaScript 代码中手动添加的优化。

在这种情况下,Dart 作为源语言并没有什么特别之处:任何生成 JavaScript 的自动化工具都应该能够做到这一点,例如 GWT 编译器(Java 到 JavaScript)也能做到这一点。当然,您也可以在 JavaScript 源代码上运行自动化工具来生成更好的 JavaScript,这就是 Closure compiler 所做的。

从技术上讲,如果您知道所有技巧,您可以手动实现与手写 JavaScript 相同的速度。

【讨论】:

这是否意味着他们的主张有些误导?真的是“优化的 JS”与“草率的 JS”? @DA 我认为“马虎”是一种不公平的错误描述。即使是写得最好的 C 代码也会错过一些对编译器来说显而易见的优化,而任何从事普通项目的人都会为可维护性进行优化。他们的说法可能略微具有误导性,但总的来说我认为它是准确的。 @ChrisHayes 这是有道理的。我想准确地说,他们应该说“dart2js 优化编译的 JavaScript”与“JavaScript” 如果我可能有点迂腐——也许是骄傲——“即使是最好的 C 代码也会错过一些对编译器来说显而易见的优化”,因为我的出发点是通常编译的代码打开了各种优化,所以如果编译器知道它,我也知道它。根据手头的任务以及您愿意投入多少时间,手动调整的代码可以在相当大的范围内击败良好、干净的编译 C。我得到的最好的结果是已经很快的代码的 50 倍。 Comp/JIT 不会竞争,但当您没有时间时,它会为您服务。

以上是关于dart2js 代码如何比 javascript 更快?的主要内容,如果未能解决你的问题,请参考以下文章

dart2js 后异步函数中两个 keyCode 的比较不正确

如何从 Javascript 调用 Dart 函数?

从 dart2js 或 dart-analyzer 获取类型化语法树

执行 `dart2js` 时会生成哪些文件?为啥?

JavaScript执行:Promise里的代码为什么比setTimeout先执行?

Silverlight是否比JavaScript具有性能优势?