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性能的更多相关文章

  1. RN性能优化(重新探索react吧)

    最近做RN遇到了一些性能瓶颈,逼着自己不得不做一些优化 已经做过,或者尝试过得优化方案: 1.点击效果防止重复点击. 2.左右两边分别用两个异步栈进行更新,这样能让右边的缓慢不影响左边的更新. 3.I ...

  2. RN 性能优化

    按需加载: 导出模块使用属性getter动态require 使用Import语句导入模块,会自动执行所加载的模块.如果你有一个公共组件供业务方使用,例如:common.js import A from ...

  3. 【腾讯Bugly干货分享】跨平台 ListView 性能优化

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...

  4. React Native Changed the World? or Nothing.

    RN是一个awesome的技术, facebook很有想法的团队创造出一项新的技术改变了native开发界. 但是RN本身又疑点重重, RN是为了解决什么问题而存在的? 在诞生了一年后, RN又解决了 ...

  5. 新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs)

    新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs) 本文翻译自:http://deeplearning4j.o ...

  6. React Native在特赞的应用与实践

    基于React技术栈构建开发前端项目,并使用React Native开发特赞移动APP 目前正在使用Node.js开发和维护特赞服务网关,希望Node.js能够在更轻量级的微服务架构中发挥重要作用 课 ...

  7. 选择 React Native 的理由

    转载:选择 React Native 的理由 从开始知道 React Native 到现在已经过了5个月,真实的试用也经历了三个月的时间.阅读文档开始,了解是什么,到简单的理解为什么,都是在聆听不同的 ...

  8. 给所有开发者的React Native详细入门指南

    建议先下载好资料后,再阅读本文.demo代码和资料下载 目录 一.前言 二.回答一些问题 1.为什么写此教程 2.本文适合哪些人看 3.如何使用本教程 4.需要先学习JavaScript.HTML.C ...

  9. 你确信 X-Forwarded-For 拿到的就是用户真实 IP 吗?

    X-Forwarded-For 拿到的就是真实 IP 吗? 1.故事 在这个小节开始前,我先讲一个开发中的小故事,可以加深一下大家对这个字段的理解. 前段时间要做一个和风控相关的需求,需要拿到用户的 ...

随机推荐

  1. socket模拟服务器,客户端下载东西(ftp)

    服务端(ftp_server.py) import hashlib,socket,os server = socket.socket() server.bind(("localhost&qu ...

  2. [软件工程基础]2017.11.01 第五次 Scrum 会议

    具体事项 燃尽图 每人工作内容 成员 已完成的工作 计划完成的工作 工作中遇到的困难 游心 #8 掌握 Laravel 框架 #10 搭建可用的开发测试环境:#9 阅读分析 PhyLab 后端代码与文 ...

  3. Python开发 第01课 Python 简介

    一.Python 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  4. 安装好的php独立添加扩展模块

    在装好php后,或者在使用php的时候,发现某个模块没有添加,而又不想重新编译安装,这时就需要单独添加扩展模块. php环境说明: 安装路径:/data/php5.6/ 解压路径:/data/php- ...

  5. 子shell

    http://bbs.csdn.net/topics/392292455 https://www.cnblogs.com/daniaoge/p/6161821.html http://blog.csd ...

  6. 转 PHP 正则表达式 以及案例

    2.Perl兼容的语法扩充 Perl兼容的正则表达式的模式类似于Perl中的语法,表达式必须包含在定界符中,除数字.字母.反斜线外的任何字符都可以作为定界符.例如,表达式’/^(?i)php[34]/ ...

  7. JavaScript Allongé 第一呷 :基础函数 (2)

    啊!我想要有一个参数 到现在为止,我们已经了解了没有参数的函数.只说我们的函数没有任何参数,甚至还没说参数是什么.大多数程序员非常熟悉参数,中学数学就讨论这个了.所以你知道他们是什么,而我也知道你知道 ...

  8. yii2 使用gii生成代码文件

    访问地址: http://localhost/yii2-test/web/index.php?r=gii  如果你通过本机以外的机器访问 Gii,请求会被出于安全原因拒绝. 在web.php修改gii ...

  9. Nodejs 定时任务

    安装扩展:node-schedule npm install node-schedule 1.linux Crontab风格 var schedule = require('node-schedule ...

  10. P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib

    题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组 ...