Flutter Dart数据转换性能发布与调试

Flutter Dart数据转换性能发布与调试,flutter,dart,Flutter,Dart,我在中使用了简单的测试代码(唯一的区别是:const int BufSize=8388608;)来测量发布版和调试版中的Dart性能,并发现奇怪的结果:发布版大约比调试版慢12倍 该代码在棒棒糖Android设备上进行了测试 我预计发布版本的构建速度会比调试快几倍,但情况恰恰相反: 调试: I/颤振(26195):转换(运行时):2654529.0 us 释放 I/颤振(26231):转换(运行时):32347612.0 us 这里怎么了?谢谢。即时编译(调试模式)可能比提前编译(发布模式)工作

我在中使用了简单的测试代码(唯一的区别是:const int BufSize=8388608;)来测量发布版和调试版中的Dart性能,并发现奇怪的结果:发布版大约比调试版慢12倍

该代码在棒棒糖Android设备上进行了测试

我预计发布版本的构建速度会比调试快几倍,但情况恰恰相反:

调试:

I/颤振(26195):转换(运行时):2654529.0 us

释放

I/颤振(26231):转换(运行时):32347612.0 us


这里怎么了?谢谢。

即时编译(调试模式)可能比提前编译(发布模式)工作得更快。这似乎是Dart的一个已知问题


    • 优化编译器中存在一个疏忽,这使得它比应该的速度慢。我已经申请修好了

      问题在于,AOT编译器在内联
      ByteData
      方法以写入8位、16位和32位整数时会发出一些不必要的推测代码。如果它以后不能证明它的猜测成立,它最终会生成更糟糕的代码。从某种意义上说,这是前飞镖2次后留下的东西

      我们将在编译器中修复它。不过,您也可以通过对这些方法的参数进行显式屏蔽来解决这个问题。例如,如果您像这样重写基准的核心

      buffer.setInt32(偏移量,intContent&0xFFFFFFFF);偏移量+=4;intContent++;
      setInt32(偏移量、intContent和0xFFFFFFFF);偏移量+=4;intContent++;
      setInt16(偏移量、intContent和0xFFFF);偏移量+=2;intContent++;
      setInt16(偏移量、intContent和0xFFFF);偏移量+=2;intContent++;
      setInt8(偏移量、intContent和0xFF);偏移量+=1;intContent++;
      setInt8(偏移量、intContent和0xFF);偏移量+=1;intContent++;
      

      它应该大大提高基准的绩效。尽管发布模式和调试模式(2-3倍)之间仍存在一些差异,因为生成的AOT代码中仍存在优化机会。

      此问题是一年多前创建的。一年后情况变得更糟,慢了12倍?认真地这是否意味着颤振不适合生产?我希望谷歌的一些工程师能帮助回答这个问题。谢谢你。我希望你能解决这个问题,使颤振更好。目前,我有一个解决办法,就是在我的应用程序中最小化在Dart中的书写。阅读速度似乎很快,我认为阅读没有问题。关于类型化的_数据,我认为肯定存在缺陷:Uint8List(和类似的列表)允许写入,例如Uint8List[2]=123;,但过了一段时间,它最终破坏了UInt8列表。如何在不损坏Uint8List的情况下修改Uint8List?谢谢,我知道buffer.setInt8()可能会很好(只是速度慢),但是指定uint8list[2]=123最终会损坏列表。如果这是一个bug,请创建一个问题。谢谢我不确定我是否理解“破坏名单”的意思。你有一个例子吗?你能发布一些代码来演示这个问题吗?我不能再重新产生列表损坏的问题了,可能是调试器/热重新加载的问题,而不是Dart Uint8List本身的问题。非常感谢。