当前位置: 首页 > wzjs >正文

南宁市网站开发公司网站关键词优化排名推荐

南宁市网站开发公司,网站关键词优化排名推荐,基于django的电子商务网站开发,网站建设公司组织架构Flutter的原理及性能实践 Flutter和原生性能对比 虽然使用原生实现(左)和Flutter实现(右)的全品类页面在实际使用过程中几乎分辨不出来: 但是我们还需要在性能方面有一个比较明确的数据对比。 我们最关心的两个页面…

Flutter的原理及性能实践

Flutter和原生性能对比

虽然使用原生实现(左)和Flutter实现(右)的全品类页面在实际使用过程中几乎分辨不出来:

原生与Flutter实现对比

但是我们还需要在性能方面有一个比较明确的数据对比。

我们最关心的两个页面性能指标就是页面加载时间和页面渲染速度。测试页面加载速度可以直接使用美团内部的Metrics性能测试工具。对于iOS开发者来说,也可以使用appuploader这类iOS开发助手工具来获取详细的性能数据。appuploader不仅可以帮助开发者上传应用到App Store,还提供了丰富的性能分析功能。

从两个实现的页面分别启动400多次的数据中可以看到,原生实现(AllCategoryActivity)的加载时间中位数为210ms,Flutter实现(FlutterCategoryActivity)的加载时间中位数为231ms。考虑到目前我们还没有针对FlutterView做缓存和重用,FlutterView每次创建都需要初始化整个Flutter环境并加载相关代码,多出的20ms还在预期范围内:

加载时间对比

加载时间数据

因为Flutter的UI逻辑和绘制代码都不在主线程执行,Metrics原有的FPS功能无法统计到Flutter页面的真实情况,我们需要用特殊方法来对比两种实现的渲染效率。Android原生实现的界面渲染耗时使用系统提供的FrameMetrics接口进行监控:

public class AllCategoryActivity extends WmBaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {getWindow().addOnFrameMetricsAvailableListener(new Window.OnFrameMetricsAvailableListener() {List<Integer> frameDurations = new ArrayList<>(100);@Overridepublic void onFrameMetricsAvailable(Window window, FrameMetrics frameMetrics, int dropCountSinceLastInvocation) {frameDurations.add((int) (frameMetrics.getMetric(TOTAL_DURATION) / 1000000));if (frameDurations.size() == 100) {getWindow().removeOnFrameMetricsAvailableListener(this);L.w("AllCategory", Arrays.toString(frameDurations.toArray()));}}}, new Handler(Looper.getMainLooper()));}super.onCreate(savedInstanceState);// ...}
}

Flutter在Framework层只能取到每帧中UI操作的CPU耗时,GPU操作在Flutter引擎内部实现,所以要修改引擎来监控完整的渲染耗时:

void Rasterizer::DoDraw(std::unique_ptr<flow::LayerTree> layer_tree) {if (!layer_tree || !surface_) {return;}if (DrawToSurface(*layer_tree)) {last_layer_tree_ = std::move(layer_tree);
#if defined(OS_ANDROID)if (compositor_context_->frame_count().count() == 101) {std::ostringstream os;os << "[";const std::vector<TimeDelta> &engine_laps = compositor_context_->engine_time().Laps();const std::vector<TimeDelta> &frame_laps = compositor_context_->frame_time().Laps();size_t i = 1;for (auto engine_iter = engine_laps.begin() + 1, frame_iter = frame_laps.begin() + 1;i < 101 && engine_iter != engine_laps.end(); i++, engine_iter++, frame_iter++) {os << (*engine_iter + *frame_iter).ToMilliseconds() << ",";}os << "]";__android_log_write(ANDROID_LOG_WARN, "AllCategory", os.str().c_str());}
#endif}
}

测试时我们将两种实现的页面分别打开100次,每次打开后执行两次滚动操作,使其绘制100帧,将这100帧的每帧耗时记录下来:

for (( i = 0; i < 100; i++ )); doopenWMPage allcategorysleep 1adb shell input swipe 500 1000 500 300 900adb shell input swipe 500 1000 500 300 900adb shell input keyevent 4
done

将测试结果的100次启动中每帧耗时取平均値,得到每帧平均耗时情况:

帧耗时对比

Android原生实现和Flutter版本都会在页面打开的前5帧超过16ms,刚打开页面时原生实现需要创建大量View,Flutter也需要创建大量Widget,后续帧中可以重用大部分控件和渲染节点。

10000帧(100次×100帧每次)中Android原生总平均値为10.21ms,Flutter总平均値为12.28ms,Android原生实现总丢帧数851帧8.51%,Flutter总丢帧987帧9.87%。在原生实现的触摸事件处理和过度绘制充分优化的前提下,Flutter完全可以媲美原生的性能。

总结

Flutter目前仍处于早期阶段,也还没有发布正式的Release版本,不过我们看到Flutter团队一直在为这一目标而努力。虽然Flutter的开发生态不如Android和iOS原生应用那么成熟,许多常用的复杂控件还需要自己实现,有的甚至会比较困难(比如官方尚未提供的ListView.scrollTo(index)功能),但是在高性能和跨平台方面Flutter在众多UI框架中还是有很大优势的。

开发Flutter应用只能使用Dart语言,Dart本身既有静态语言的特性,也支持动态语言的部分特性,对于Java和JavaScript开发者来说门槛都不高,3-5天可以快速上手,大约1-2周可以熟练掌握。对于iOS开发者来说,可以结合appuploader这样的工具来简化开发流程,提高开发效率。

在开发全品类页面的Flutter版本时我们也深刻体会到了Dart语言的魅力,Dart的语言特性使得Flutter的界面构建过程也比Android原生的XML+JAVA更直观,代码量也从原来的900多行减少到500多行(排除掉引用的公共组件)。Flutter页面集成到App后APK体积至少会增加5.5MB,其中包括3.3MB的SO库文件和2.2MB的ICU数据文件,此外业务代码1300行编译产物的大小有2MB左右。

Flutter本身的特性适合追求iOS和Android跨平台的一致体验,追求高性能的UI交互效果的场景,不适合追求动态化部署的场景。Flutter在Android上已经可以实现动态化部署,但是由于Apple的限制,在iOS上实现动态化部署非常困难,Flutter团队也正在和Apple积极沟通。

美团外卖大前端团队将来也会继续在更多场景下使用Flutter实现,并且将实践过程中发现和修复的问题积极反馈到开源社区,帮助Flutter更好地发展。

参考资料

  1. Flutter中文官网
  2. Flutter框架技术概览
  3. Flutter插件仓库
  4. A Tour of the Dart Language
  5. A Tour of the Dart Libraries
  6. Why Flutter Uses Dart
  7. Flutter Layout机制简介
  8. Flutter’s Layered Design
  9. Flutter’s Rendering Pipeline
  10. Flutter: The Best Way to Build for Mobile?@GOTO conf
  11. Flutter Engine
  12. Writing custom platform-specific code with platform channels
  13. Flutter Engine Operation in AOT Mode
  14. Flutter’s modes
  15. Symbolicating-production-crash-stacks

作者简介

els
13. Flutter Engine Operation in AOT Mode
14. Flutter’s modes
15. Symbolicating-production-crash-stacks

作者简介

少杰,美团高级工程师,2017年加入美团,目前主要负责外卖App监控等基础设施建设工作。

http://www.dtcms.com/wzjs/471544.html

相关文章:

  • 我想做一个小网站搞页游该怎么做百度指数分析官网
  • 自己做的网站转成二维码揭阳新站seo方案
  • 海洋公司做网站推广短视频推广策略
  • 做淘客网站去哪里购买空间目前较好的crm系统
  • 盘锦网站建设哪家好网站流量统计工具
  • wordpress php 链接seo外链优化策略
  • 网站开发常去的论坛网站优化提升排名
  • 免费做图素材网站互联网广告平台代理
  • 怎样找公司做单的网站友情链接的作用大不大
  • 百姓网二手拖拉机亚马逊seo是什么意思
  • 桂林建设银行招聘网站网站一级域名和二级域名区别
  • 时时彩网站开发公司bilibili官网网页入口
  • 互助平台网站建设seo网站快排
  • 做商品网站数据库有哪些内容论坛推广的步骤
  • 天津营销型网站建设费用关键词智能优化排名
  • 做网站一般用什么系统网站优化检测工具
  • 东莞电子网站建设怎么接app推广的单子
  • 苏州网站建设制作网络公司长沙关键词自然排名
  • 那个网站可以做宣传seo顾问收费
  • php网站怎么用mysql新建数据库网上全网推广
  • 同ip多域名做同行业网站推广的十种方式
  • 网站每日签到怎么做如何自己建个网站
  • 唐山市丰润区城乡建设局网站产品运营推广方案
  • 哪建设网站百度关键词排行榜
  • 低价建设手机网站设计公司网站模板
  • wordpress的css优化服务公司
  • 彩页设计尺寸长沙网站优化价格
  • 免费个人网站2018软文兼职10元一篇
  • 水果销售网站开发文献综述seo同行网站
  • 房产投资还有前景吗网站seo诊断分析和优化方案