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

我在How to improve Dart performance of data conversion to/from binary?中使用了简单的测试代码(唯一的区别是:const int BufSize = 8388608;)来测量Dart在发布和调试构建中的性能,并发现奇怪的结果:发布构建的速度比调试慢约12倍!

该代码已在Lollipop Android设备上进行了测试。

我希望发布版本比调试版本快几倍,但一切完全相反:

调试:

I / flutter(26195):Conversion(RunTime):2654529.0 us。

发布

I / flutter(26231):Conversion(RunTime):32347612.0 us。

这是怎么了?谢谢。

prety915 回答:Dart数据转换性能发布与调试相比

即时编译(调试模式)的运行速度可能比即时编译(发布模式)快。对于Dart来说,这似乎是一个已知问题。

,

优化编译器中有一个疏忽之处,使它的速度慢于应有的速度。我已提交an issue进行修复。

问题在于,当内联ByteData方法来写入8、16和32位整数时,AOT编译器会发出一些不必要的推测性代码。如果以后无法证明其推测成立,则最终会生成很多较差的代码。从某种意义上说,这是飞镖赛之前留下的2倍。

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

      buffer.setInt32(offset,intContent & 0xFFFFFFFF); offset += 4; intContent++;
      buffer.setInt32(offset,intContent & 0xFFFFFFFF); offset += 4; intContent++;
      buffer.setInt16(offset,intContent & 0xFFFF); offset += 2; intContent++;
      buffer.setInt16(offset,intContent & 0xFFFF); offset += 2; intContent++;
      buffer.setInt8(offset,intContent & 0xFF); offset += 1; intContent++;
      buffer.setInt8(offset,intContent & 0xFF); offset += 1; intContent++;

它将显着提高基准性能。尽管释放和调试模式(2-3x)之间仍然会有一些差异,因为生成的AOT代码中仍然存在优化机会。

本文链接:https://www.f2er.com/3168185.html

大家都在问