Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译成JS的Dart代码似乎比Dart(在Dartium中)更快_Dart_Dartium - Fatal编程技术网

编译成JS的Dart代码似乎比Dart(在Dartium中)更快

编译成JS的Dart代码似乎比Dart(在Dartium中)更快,dart,dartium,Dart,Dartium,Dart的性能给我留下了深刻的印象,我制作了一个非常简单的web应用程序来渲染Dart中的Mandelbrot集(使用HTML5画布)。这绝对不是一个现实的性能测试。该页面在800x600画布中呈现Mandelbrot集,最大深度为10.000。 可以在此处看到该应用程序: 让我困惑的是:在Dartium中运行,图像渲染时间约为8.5秒(令人印象深刻)。Firefox中的同一页面花费的时间超过15秒。这并不奇怪 但是在Chrome(版本27.0.1453.93)中运行相同的页面,Chrome不运

Dart的性能给我留下了深刻的印象,我制作了一个非常简单的web应用程序来渲染Dart中的Mandelbrot集(使用HTML5画布)。这绝对不是一个现实的性能测试。该页面在800x600画布中呈现Mandelbrot集,最大深度为10.000。 可以在此处看到该应用程序:

让我困惑的是:在Dartium中运行,图像渲染时间约为8.5秒(令人印象深刻)。Firefox中的同一页面花费的时间超过15秒。这并不奇怪

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

为什么会这样

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


封闭式问题后更新:仅作记录:在这种特定情况下,将代码移动到并行工作程序/隔离程序中不仅带来了显著的性能提升,而且Dart现在显然将JS版本留在了尘埃中,原因有很多。在我的脑海里:

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

画布绑定和API存在一个已知问题。请看

我只是在猜测,所以这里是评论而不是答案。Chrome对JS引擎进行了大量优化。Dartium是一个开发工具——如果Dart虚拟机是为调试而配置的,而不是在这种情况下的速度,我不会感到惊讶。此外,尽管基准测试显示DartVM比V8快,但这些都是通用基准测试。某些部件(图形?)在V8中仍然可以得到更好的优化您是否在启用“选中模式”的情况下运行Dartium?这增加了开销,因为它在运行时断言所有类型(检查运行>设置)。您也在Dartium中测试过js版本吗?与您的问题无关:如果您想测量时间跨度,请使用“可能希望使用秒表类而不是DateTime”。请参阅我的更新:我在Dartedit中关闭了检查模式,但这可能还不够。Dartium中的JS版本与Chrome中的性能大致相同。我换上了秒表课,谢谢你的提示!同样的时间,但是Stopwatch类允许我轻松地排除像素的绘制。如果没有这些,Dart和JS之间的执行时间非常相似。不过JS版本的速度要快一些。:)非常感谢您的评论!谢谢,弗洛里安!预热优化似乎不是问题所在。我将尝试在未选中模式下运行(在我看来,Dartedit中的开关实际上并没有关闭选中模式…?),这是剩下的最合理的解释。这非常有趣,谢谢!我的程序的最新版本不包括对绑定的调用(在绘制像素之前停止秒表,然后再次启动)。现在差别很小。但是JS仍然(稍微)快一点。