RN性能
https://facebook.github.io/react-native/docs/performance.html
一个使用RN而不是webView的重要原因是可实现60fps以及更类似原生app的用户体验。RN的性能比较好,但某些地方仍然需要用户去手动优化
帧
打开Show Perf Monitor可以查看到帧率信息。这里有两个不同的帧率
JS帧率
一般来说,业务逻辑运行在JS线程,在每轮事件循环后以及每帧的期限之前,都去更新视图以及把视图发送到原生平台。假如JS线程对一个帧无响应,则这个帧就会被丢弃。如对于一个复杂应用,执行setState重新渲染一颗子树需要消耗200ms,则大概有12帧会丢失,任何JS控制的动画在这段期间都会停止。
这通常发生在Navigator过渡。当我们添加一个路由,为了能发送合适的指令给原生平台来创建视图,JS线程会渲染路由内所有的组件,这需要花费几帧的时间,导致Jank(用户能明显感觉到帧率下降,影响用户体验,这个现象称为Jank),这是因为过渡由JS线程来控制的。而且组件中的componentDidMount内可能还会做其他耗时的事情,这会使动画过渡出现更加明显的卡顿。
另外一个例子就是对触摸的响应。举个例子,如果JS线程执行的逻辑需要消耗几帧的时间,则可以发现TouchableOpacity有延迟。这是因为JS线程正忙,无法处理从主线程发来的原生触摸事件,这就到时TouchableOpacity无法处理触摸事件以及无法调整视图的透明度。
UI帧率
NavigatorIOS的性能要比Navigator要好,这是因为动画的过渡在主线程中完成,而不在JS线程中。如果在JS线程中可能因为逻辑过多导致一些帧被丢弃。
类似地,当JS线程正忙,也可以使用ScrollView,因为它存在于主线程,滚动的事件会传递给JS线程,但JS线程中的对应事件处理器对ScrollView的滚动是无影响的。
常见性能问题的源头
运行在开发环境
在处于开发环境时(dev=true),JS线程性能比较差,这是不可以避免,因为需要在运行时提供警告以及错误信息。但可以在release build(安装的时候执行 react-native run-android --variant=release)下进行性能测试
使用console.log
这个语句在运行的时候,会给JS线程造成巨大的瓶颈,需要保证在发布的时候移除这些日志输出。可以通过babel-plugin-transform-remove-console插件来实现,在项目的目录添加一个.babelrc文件:
{
"env": {
"production": {
"plugins": ["transform-remove-console"]
}
}
}
当发布的时候,这些console.*就会自动被移除了。
ListView
使用FlatList或者SectionList来替换,除了可以简化API,这些新的列表组件由显著的性能增强,主要是当列表item数据量较大时,只消耗常量级别的内存。
假如FlatList渲染较慢,要确保实现了getItemLayout来跳过测量已经渲染过了的item。
重新渲染一个不变化的视图
通过shouldComponentUpdate来决定组件什么时候要重新渲染,可以通过PureRenderMixin + immutable来实现一个纯组件(render的返回由state和props来控制)
JS线程同时做太多工作以至于丢失一些帧
明显的例子就是缓慢的路由过渡
待续。
RN性能的更多相关文章
- RN性能优化(重新探索react吧)
最近做RN遇到了一些性能瓶颈,逼着自己不得不做一些优化 已经做过,或者尝试过得优化方案: 1.点击效果防止重复点击. 2.左右两边分别用两个异步栈进行更新,这样能让右边的缓慢不影响左边的更新. 3.I ...
- RN 性能优化
按需加载: 导出模块使用属性getter动态require 使用Import语句导入模块,会自动执行所加载的模块.如果你有一个公共组件供业务方使用,例如:common.js import A from ...
- 【腾讯Bugly干货分享】跨平台 ListView 性能优化
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...
- React Native Changed the World? or Nothing.
RN是一个awesome的技术, facebook很有想法的团队创造出一项新的技术改变了native开发界. 但是RN本身又疑点重重, RN是为了解决什么问题而存在的? 在诞生了一年后, RN又解决了 ...
- 新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs)
新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs) 本文翻译自:http://deeplearning4j.o ...
- React Native在特赞的应用与实践
基于React技术栈构建开发前端项目,并使用React Native开发特赞移动APP 目前正在使用Node.js开发和维护特赞服务网关,希望Node.js能够在更轻量级的微服务架构中发挥重要作用 课 ...
- 选择 React Native 的理由
转载:选择 React Native 的理由 从开始知道 React Native 到现在已经过了5个月,真实的试用也经历了三个月的时间.阅读文档开始,了解是什么,到简单的理解为什么,都是在聆听不同的 ...
- 给所有开发者的React Native详细入门指南
建议先下载好资料后,再阅读本文.demo代码和资料下载 目录 一.前言 二.回答一些问题 1.为什么写此教程 2.本文适合哪些人看 3.如何使用本教程 4.需要先学习JavaScript.HTML.C ...
- 你确信 X-Forwarded-For 拿到的就是用户真实 IP 吗?
X-Forwarded-For 拿到的就是真实 IP 吗? 1.故事 在这个小节开始前,我先讲一个开发中的小故事,可以加深一下大家对这个字段的理解. 前段时间要做一个和风控相关的需求,需要拿到用户的 ...
随机推荐
- django_logging
django使用python自带的logging打印日志 logging 是线程安全的,其主要由4部分组成: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志输出 ...
- C#基础之方法
方法组成为: public void Fun(string name) { 代码块 } 1.方法的访问级别:修饰符,即上边的Public 2.返回类型:方法是否具有返回值,上边方法无返回值即为void ...
- 关于foreach的一个BUG
foreach用起来比for更方便,但是foreach隐藏的操作,可能带来更多未知的BUG,今天就遇到一个问题.编程环境VS2010 //使用foreach遍历,其中未改变item的值,但是使用了匿名 ...
- 1047 - Best couple 好题~
http://www.ifrog.cc/acm/problem/1047 思路很简单,跑一发floyd,然后再用km. 但是问题来了,这个有可能n != m.那怎么办? 其实可以补上一些不存在的点.来 ...
- AQS及其前置知识总结
CLH队列锁 及自旋锁 乐观锁及CAS 独占锁与共享锁 LockSupport与wait ,join和notify 这里截取内部类Node的部分代码,节点的状态值如下: /** waitStatus ...
- JavaScriptSerializer类序列化日期时需要注意的问题
1.让我们来看看使用JavaScriptSerializer类序列化日期会出现什么问题? 1)创建用于序列化的测试类,如下: public class Person { public int ID { ...
- css3のborder-radius
css3のborder-radius 今天主要练习了一下border-radius这个属性,这个是最常用的属性,所以先从它开始学习和总结吧. 我觉得需要注意以下几点: 1.书写规范: -webkit- ...
- bug 查找 (二) 从前端找到后端
bug 查找 (二) 从前端找到后端 几天来,组长说我们系统的 apm 数据不正确,最体表现就是前端项目这几天错误统计为 0. 这不正常(没有办法,我们代码写的很烂),因为前端环境很复杂,网络,浏览器 ...
- MySql数据库的相关操作
SQL(Structred Query Language)结构化查询语言:和数据库交互的语言,进行数据库管理的语言. 一.数据库的操作: 1.查询所有数据库: show databases; 2.创建 ...
- 断言assert用法
本文转自:http://blog.jobbole.com/76285/ 这个问题是如何在一些场景下使用断言表达式,通常会有人误用它,所以我决定写一篇文章来说明何时使用断言,什么时候不用. 为那些还不清 ...