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

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

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

【问题讨论】:

  • 因为它可以使用你不知道或懒得做的优化。

标签: javascript performance dart dart2js


【解决方案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 不会竞争,但当您没有时间时,它会为您服务。
猜你喜欢
  • 2021-03-25
  • 2012-05-25
  • 2012-09-05
  • 2013-07-29
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多