流言终结者- Flutter和RN谁才是更好的跨端开发方案?

背景

论坛上很多小伙伴关心为什么闲鱼选择了Flutter而不选择其他跨端方案?站在质量的角度,高性能是一个很重的因素,我们使用Flutter重写了宝贝详情页之后,对比了Flutter和Native详情页的性能表现,结论是中高端机型上Flutter和Native不相上下,在低端机型上,Flutter会比Native更加的流畅,其实闲鱼团队在使用Flutter做详情页过程中,没有更多地关注性能优化,为了更快地上线,也是优先功能的实现,不过测试结果出来之后,却出乎意料地优于原先的Native的实现(具体的测试结果,属于敏感数据,要走披露流程,伤不起…)

但是这样很显然不能敷衍过去,仔细想了想,确实Flutter的定位并不是要替代Native,他只想做一个极致的跨端解决方案,所以还是要回到跨端解决方案的赛道,给您从性能角度比一比,谁才是更好的跨端开发方案?

参赛选手

[Flutter]

Flutter is Google’s mobile app SDK for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.

[REACT NATIVE]

We're working on a large-scale rearchitecture of React Native to make it more flexible and integrate better with native infrastructure in hybrid JavaScript/native apps.

鸣锣开赛

怎么比

怎么比较确实伤脑筋,自己也写了一个Flutter 和 一个RN的App,但是实在太丑陋,担心大家关注点都到我的烂代码上了,所以在Github上找到了一个跨端开发高手Car Guo,用Flutter和RN分别实现的一个实际可用的App,Car Guo谦虚表示其实也写的比较粗糙,但是在我看来这个是具备真实使用场景的App(Github客户端App,提供丰富的功能,旨在更好的日常管理和维护个人Github),还是有代表性的
[Flutter] https://github.com/CarGuo/GSYGithubAppFlutter
[REACT NATIVE] https://github.com/CarGuo/GSYGithubApp

场景

1、默认登录成功
2、“动态”页,点击搜索按钮,搜索关键字“Java”,正常速度浏览3页,等第4页加载完成后回退
3、点击“趋势”页Tab,浏览Feeds到页面底部,点击最底部的Item,进入Item后,浏览详情+浏览3页的动态后回退,到“我的”Tab页
4、查看“我的”Feeds到底部,点击右上角搜索按钮,搜索关键字“C”,浏览3页后,等第4页加载完成后场景结束

测试工具

  • iOS
  • 掌中测(iOS端):CPU,内存
  • Instruments:FPS
  • Android
  • 基于Adb的Shell脚本:CPU,内存,FPS

测试机型

  • iOS:iPhone 5c 9.0.1 / iPhone 6s 10.3.2
  • Android:Xiaomi 2s 5.0.2 / Sumsung S8 7.0

数据分析

iOS

iPhone 5c 9.0.1

iPhone 6s 10.3.2

测试结论

1、Flutter在低端和中端的iOS机型上,FPS的表现都优于RN
2、CPU的使用上Flutter在低端机上表现略差于RN,中端机型略优于RN
3、值得注意的是内存上的表现(上图红色箭头区域),Flutter在低端机型上的起始内存和RN几乎一致,在中端机型上会多30M左右的内存(分析为Dart VM的内存),可以想到这应该是Flutter针对低端和中端机型上内存策略是不一样的,可用内存少的机型,Dart VM的初始内存少,运行时进行分配(这样也可以理解为什么在低端机上带来了更多的CPU损耗),中端机器上预分配了更多的VM内存,这样在处理时会更加的游刃有余,减少CPU的介入,带来更流畅的体验.
可以看出,Flutter团队在针对不同机型上处理更加的细腻,目的就是为了带来稳定流畅的体验。

Android

Xiaomi 2s 5.0.2

Sumsung S8 7.0

  • 注: MFS - Max Frame Space: 指的是去掉buffer之后的两帧的时间差

测试结论

1、Flutter在高低端机的CPU上的表现都优于RN,尤其在低端的小米2s上有着更优的表现
2、Android端在原来FPS基础上增加了流畅度的指标,FPS和流畅度的表现Flutter优于RN(计算规则见附参考文章)
3、Android端的内存也是值得关注的一点,在小米2s上起始内存Flutter明显比RN多40M,RN在测试过程中内存飞涨,Flutter相比之下会更稳定,内存上RN侧的代码是需要调优的,同一套代码Flutter在Android和iOS上并没有很大的差异,但是RN的却要在单端调优,Flutter在这项比拼上又更胜一筹。
比较奇怪的是三星S8上Flutter和RN的初始内存是一致的,猜测是RN也Android高端机型上也会预分配一些内存,具体细节还需要更进一步的研究。

升旗仪式

看了之前的数据,做为裁判的我会把金牌颁给Flutter,在测试过程中的体验和数据上来看Flutter都优于RN,并且开发这个App的是一位Android的开发同学,Flutter和RN对于他来说都是全新的技术栈,Car Guo同学更倾向性地让大家得到一致性的使用体验,性能方面并没有投入太多的时间进行调优,由此看出Flutter在跨端开发上在同样投入的情况下,可以获得更佳的性能,更好的用户体验。

一些思考

拿到了这些数据,也感受到Flutter带来福利,那Flutter为什么可以做到这么流畅呢?Flutter是如何优化了渲染,Dart VM的Runtime是怎么玩的?请大家继续关注后续解密文章,感兴趣的同学欢迎加入闲鱼,成为跨端解决方案的领军者。

参考

  • Android FPS&流畅度: https://testerhome.com/topics/4775
  • Android 内存获取方式:
    dumpsys meminfo packageName
  • Android CPU 通过busybox 执行 top命令获取
  • iOS CPU获取方式:累计每个线程中的CPU利用率
for (j = 0; j < thread_count; j++)
{
ATCPUDO *cpuDO = [[ATCPUDO alloc] init];
char name[256];
pthread_t pt = pthread_from_mach_thread_np(thread_list[j]);
if (pt) {
name[0] = '\0';
__unused int rc = pthread_getname_np(pt, name, sizeof name);
cpuDO.threadid = thread_list[j];
cpuDO.identify = [NSString stringWithFormat:@"%s",name];
} 
thread_info_count = THREAD_INFO_MAX;
kr = thread_info(thread_list[j], THREAD_BASIC_INFO,(thread_info_t)thinfo, &thread_info_count);
if (kr != KERN_SUCCESS) {
return nil;
}
basic_info_th = (thread_basic_info_t)thinfo;
if (!(basic_info_th->flags & TH_FLAGS_IDLE)) {
tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds;
tot_usec = tot_usec + basic_info_th->system_time.microseconds + basic_info_th->system_time.microseconds;
tot_cpu = tot_cpu + basic_info_th->cpu_usage / (float)TH_USAGE_SCALE * 100.0;
cpuDO.usage = basic_info_th->cpu_usage / (float)TH_USAGE_SCALE * 100.0;
if (container) {
[container addObject:cpuDO];
}
}
} // for each thread
  • iOS 内存获取方式:测试过程中使用的是phys_footprint,是最准确的物理内存,很多开源软件用的是resident_size(这个值代表的是常驻内存,并不能很好地表现出真实内存变化,这可以另开文章细谈)
if ([[UIDevice currentDevice].systemVersion intValue] < 10) {
kern_return_t kr;
mach_msg_type_number_t info_count;
task_vm_info_data_t vm_info;
info_count = TASK_VM_INFO_COUNT;
kr = task_info(mach_task_self(), TASK_VM_INFO_PURGEABLE, (task_info_t)&vm_info,&info_count);
if (kr == KERN_SUCCESS) {
return (vm_size_t)(vm_info.internal + vm_info.compressed - vm_info.purgeable_volatile_pmap);
}
return 0;
}task_vm_info_data_t vmInfo;
mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
kern_return_t result = task_info(mach_task_self(), TASK_VM_INFO, (task_info_t) &vmInfo, &count);
if (result != KERN_SUCCESS)
return 0;
return (vm_size_t)vmInfo.phys_footprint;


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【独家揭秘】阿里怎么做双11全链路压测?| CSDN 博文精选

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 牛兔转自 &#xff5c; CSDN企业博客责编 | 阿秃阿里妹导读&#xff1a;全链路压测是阿里的首创&#xff0c;我们将从工作内容、操作过程、运行总结等多个方向来介绍下阿里内部典型电商活动&#xff08;如双11准备&#xff…

Centos7 使用Docker 安装Oracle 截图+关键步骤说明

yum install dockerdocker -v systemctl start docker systemctl status dockerdocker拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g#查看拉去的oracle镜像 docker images创建Oracle容器 docker run -d -p 1521:1521 --name oracle_11g registr…

阿里程序员深夜智救31楼跳楼邻居

“我妈跳楼了&#xff0c;快救救她&#xff01;”。 8月20日凌晨的四点半左右&#xff0c;我被一阵急促的锤门声音吵醒。 听到这句话&#xff0c;没来得及思考&#xff0c;我就冲出了门。 我们住在31楼&#xff0c;出事的地点在邻居家的主卧&#xff0c;当时女主人整个人都悬…

数学建模亚太赛优秀论文_2019亚太地区大学生数学建模竞赛志愿者等级评定结果公布!...

2019亚太地区大学生数学建模竞赛志愿者通过赛氪官网招募&#xff0c;本届竞赛共招到来自193所高校的394名志愿者&#xff0c;根据志愿者邀请队伍数和志愿者任务的完成情况&#xff0c;共评选出344名志愿者&#xff0c;6个优秀组织社团。一路相伴&#xff0c;感谢有你~下面是志愿…

看完秒懂的排序算法

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 奎哥责编 | 阿秃之前的文章咱们已经聊过了下图是常用排序算法的时间空间复杂度&#xff1a;排序算法这么多&#xff0c;这里先将排序算法做个简单分类&#xff1a;一、可以根据待排序的数据量规模分类&#xff1a;内部排序&…

手把手教你创建容器服务Kubernetes集群

Kubernetes作为目前最流行的容器编排工具&#xff0c;被越来越多的用户所接受&#xff0c;目前也有越来越多的用户开始考虑使用Kubernetes集群来部署生产应用。那么&#xff0c;此时用户可能面临一个问题&#xff0c;如何规划和创建合适的Kubernetes集群呢&#xff1f; 接下来的…

Navicat 12 连接oracle闪退问题

#首先查看自己oracle的版本 select * from v$version;然后去官网下载instantclient对应的版本instantclient 我的版本是instantclient-basic-windows.x64-11.2.0.4.0.zip 找到对应版本下载即可 最后解压&#xff0c;将解压的文件instantclient_11_2 直接放到安装Navicat的目录…

python遗传算法计算实例_遗传算法python简单例子(详解)

# -*-coding:utf-8 -*- #目标求解sin(x)最大值 import random import math import matplotlib.pyplot as plt #初始化种群 生成chromosome_length大小的population_size个个体的种群 def species_origin(population_size,chromosome_length): population[[]] #one dimension re…

四个变量的图表怎么做_品牌策划方案怎么做?5步图文帮你绘制专业策划图表...

品牌策划方案是指通过对目标对象、竞争对手等相关数据的收集及详细分析&#xff0c;创造性地提出的区别于其他竞争者&#xff0c;能够体现自身特色的名称或符号&#xff0c;用以识别某款产品。品牌策划方案需要策划人具备以下能力&#xff1a;高瞻远瞩&#xff0c;看得到品牌的…

阿里云开放国内首个云端数据库测试平台,云已成为数据库新标准;华为5G随行WiFi发布;科大讯飞推出 AI 专用语音芯片系列……...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

AWD-LSTM为什么这么棒?

AWD-LSTM是目前最优秀的语言模型之一。在众多的顶会论文中&#xff0c;对字级模型的研究都采用了AWD-LSTMs&#xff0c;并且它在字符级模型中的表现也同样出色。 本文回顾了论文——Regularizing and Optimizing LSTM Language Models &#xff0c;在介绍AWD-LSTM模型的同时并…

使用Navicat Premium 12 连接远程Oracle数据库

文章目录1. Nacicat premium 12.1.11下载2. 点击【连接】-【ORACLE】3. 输入连接信息异常解决方案1. Nacicat premium 12.1.11下载 Nacicat premium 12.1.11破解版 32/64位 2. 点击【连接】-【ORACLE】 3. 输入连接信息 #连接信息如下&#xff1a; Hostname: 192.168.1.101 …

NLP深度学习:近期趋势概述(一)

在最近发表的论文中&#xff0c;Young及其同事汇总了基于深度学习的自然语言处理&#xff08;NLP&#xff09;系统和应用程序的一些最新趋势。本文的重点介绍是对各种NLP任务&#xff08;如视觉问答&#xff08;QA&#xff09;和机器翻译&#xff09;最新技术&#xff08;SOTA&…

matlab meshgrid函数_从零开始的matlab学习笔记——(28)立体图切面与三视图

matlab应用——求极限&#xff0c;求导&#xff0c;求积分&#xff0c;解方程&#xff0c;概率统计&#xff0c;函数绘图&#xff0c;三维图像&#xff0c;拟合函数&#xff0c;动态图....更多内容尽在个人专栏&#xff1a;matlab学习这一节我们说一说立体图的切面问题slice函数…

NLP深度学习:近期趋势概述(二)

递归神经网络&#xff08;RNN&#xff09; RNN是专门用于处理顺序信息的神经网络的方法。RNN将计算应用于以先前计算结果为条件的输入序列。这些序列通常由固定大小的标记向量表示&#xff0c;他们被顺序送至循环单元。下图说明了一个简单的RNN框架。 RNN的主要优势在于能够记…

使用IntelliJ IDEA 2019.3.2 x64 远程连接oracle数据库

登录验证第2种方式&#xff1a; 点击【Database】-【Data Source】-【Oracle】 输入连接信息&#xff0c;点击【Test Connection】-【OK】 Hostname: 192.168.1.101 Port: 1521 Sid: helowin Username: system Password: oracle 注释&#xff1a;第一次应该会下载客户端依赖&…

起底中国 IT 发展 20 年!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 马超责编 | 阿秃刚开始撰写此文时恰逢我结婚10周年纪念日&#xff0c;暮然回首&#xff0c;我突然发现第一款浏览器Worldwideweb出现在1990年&#xff0c;Java与Python都诞生于1994年&#xff0c;甚至被沿用至今的Visual st…

TableStore发布多元索引功能,打造统一的在线数据平台

什么是NoSQL “NoSQL”一词最早出现在1998年&#xff0c;距今刚好二十年。站在今天回头看的话&#xff0c;很少有人能想到在关系型数据库成熟发展了三十年&#xff0c;已经在数据存储领域占据了不可动摇的的地位后&#xff0c;NoSQL数据库尽然还可以快速地异军突起&#xff0c…

阿里是如何“宠”员工的?除了福利,还有这满屏黑科技

分散在世界各地的六万阿里员工是如何快速协同工作的&#xff1f; 在2018年杭州云栖大会现场&#xff0c;一块近4米宽的企业信息化大屏上&#xff0c;展示了全球阿里员工1天的云上办公与连接情况。 目前阿里巴巴的办公网络与音视频会议已经覆盖全球33个国家和地区&#xff0c;其…

里用gam使用_第一次使用Roam一头雾水?

有感于自己使用Chrome插件&#xff0c;自己看了官方文档也是一头雾水的状态&#xff0c;想到自己使用的Roam Research&#xff0c;用了好几个月也是不断摸索的&#xff0c;记录下使用Roam Research方法供新手们参考。工具的使用是简单的&#xff0c;但是看着详尽的工具文档和使…