【问题标题】:Dart code compiled to JS seems to be faster than Dart (in Dartium)编译成 JS 的 Dart 代码似乎比 Dart 快(在 Dartium 中)
【发布时间】:2013-05-23 10:04:00
【问题描述】:

对 Dart 的性能印象深刻,我编写了一个非常简单的 Web 应用程序来渲染 Dart 中的 Mandelbrot 集(使用 HTML5 画布)。这绝不意味着作为一个现实的性能测试。该页面在最大深度为 10.000 的 800x600 画布中呈现 Mandelbrot 集。 该应用程序可以在这里看到:http://goo.gl/DLuQp

让我感到困惑的是:在 Dartium 中运行,图像在大约 8.5 秒内呈现(令人印象深刻)。 Firefox 中的同一页面需要>15 秒。这并不奇怪。

但是在 Chrome(版本 27.0.1453.93)中运行相同的页面,它不运行 Dart 但 JS 版本同样在 6.7 秒内完成,比 Dart 快?

为什么会这样?

更新: 我添加了一个“运行”按钮来重新渲染画布(以验证预热行为)。我还添加了一个 JS-only 版本(当然是相同的代码)来检查 Dartium 中的 JS。简而言之:数字和我的问题保持不变。热身似乎没有效果。 Dartium 中的 JS 版本比 Dart 版本更快。

结束问题后更新:仅作记录:在这种特定情况下,将代码移动到并行工作器/隔离器中不仅显着提高了性能,而且 Dart 现在显然将 JS 版本抛在了后面 10 倍.

【问题讨论】:

  • 我只是猜测,所以这里是评论而不是答案。 Chrome 有大量优化的 JS 引擎。 Dartium 是一个开发工具——如果 Dart VM 被配置为调试而不是在这种情况下加速,我不会感到惊讶。此外,尽管基准测试显示 DartVM 比 V8 更快,但这些都是通用基准测试。某些部分(图形?)在 V8 中仍然可以得到更好的优化
  • 您是否在打开“检查模式”的情况下运行 Dartium?这增加了开销,因为它在运行时断言所有类型(检查运行>设置)。
  • 你在 Dartium 中也测试过 js 版本吗?
  • 独立于你的问题:如果你想测量时间跨度,使用可能想要使用 Stopwatch 类而不是 DateTime。
  • 查看我的更新:我在 Dartedit 中关闭了检查模式,但这可能还不够。 Dartium 中的 JS 版本与 Chrome 中的性能大致相同。我切换到秒表课,谢谢你的提示!同样的时间,但 Stopwatch 类允许我轻松排除像素的绘制。没有这些,Dart 和 JS 之间的执行时间非常相似。 JS 版本还是要快一些。 :) 非常感谢你们所有的 cmets!

标签: dart dartium


【解决方案1】:

可能有几个原因。从我的脑海中浮出水面:

  • Dart VM 错过了一些优化。 V8 比 Dart-VM 更老,一些优化还没有进入 Dart。
  • 您没有进行热身运行。 Dart-VM 目前不做 OSR(栈上替换)。当一个函数被调用时,它将以与它开始时相同的“模式”结束。也就是说,如果一个重要的函数在非优化模式下启动,但包含一个非常重要的循环(并且运行了很长时间),那么 Dart VM 不会用优化的版本替换它。一个简单的解决方法是首先执行函数(可能使用较小的值),以便优化函数。最终 OSR 将进入 Dart VM。
  • 确保您没有在检查模式下运行。 Dart-VM 在未选中模式下可以更快。

【讨论】:

  • 谢谢,弗洛里安!热身优化似乎不是问题。我将尝试在未检查模式下运行(在我看来,Dartedit 中的开关实际上并没有关闭检查模式..?),这是剩下的最合理的解释。
【解决方案2】:

这是画布绑定和 API 的一个已知问题。见http://dartbug.com/10344

【讨论】:

  • 这很有趣,谢谢!我的程序的最新版本不包括对绑定的调用(秒表在绘制像素之前停止,然后再次启动)。现在差别很小。但是 JS 仍然(有点)快。
猜你喜欢
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2016-02-21
  • 2021-12-02
相关资源
最近更新 更多