React-Native 与Native 性能的对比

多内容加载:

验证环境:

  • Xcode 8.3
  • ReactNative 0.44.0
  • Swift 3.0
  • iphone6s

代码部分,原生一个工程,RN一个工程:

  • http://gitlab.rrsmll.com/frontend/reactNative-app
  • http://gitlab.rrsmll.com/frontend/native-app
  1. Native:

    1.1 内存:大约有 100多条数据,当程序第一次启动时,App 的占用内存约为20~30Mb,此时已经完成首页的两个网络并行网络请求,已经获取得到100多条数据,当我们滑动主界面加载页面时,内存使用会涨到50左右,最高到达52Mb,并在滑动界面的过程中进行上下波动,当我们停止界面滚动时,内存使用趋于平稳.

    得益于 Native中 tableView 的内存回收,当滚动加载内容时,内存能够很好的保持平稳

    1.2 CPU 的使用情况是,每当从界面静止状态进行滑动界面时会出现一次 CPU 的使用高峰,在随后的滑动工程中CPU 的使用率与滑动速度有关联,当滑动过快时,CPU 的使用率也会相应的升高。

    1.3 滑动帧数

    Native 在快速滑动的时候表现良好,并没有出现掉帧的情况,帧率基本保持40以上

  2. React-Native

    2.1 内存:App 启动进行网络请求,获得首页数据约有30条,此时 App 内存占用约为85 ~90Mb,在首页根据网络获得内容渲染界面时,内存使用达到100Mb 左右,随后内存恢复到87Mb,内存的使用波动比较大,在界面滑动的时候内存的使用是比较大的,因为 现在的ReactNative列表使用的是FlatList,FB 在底层实现了 View 的回收利用所以担当界面平稳时,内存的使用也趋于平稳


2.2 CPU:ReactNative 需要开辟专门的 js 线程,第一次启动时,出现了一次 CPU 负载的情况使用率达到143%左右,随后快速滑动首页,CPU使用波动也是比较大,但是与 Native 不同,RN 的 CPU 使用率要高出一些,当滑动过快时 CPU 的使用会出现过高的情况。

2.3 帧率:当在滑动界面的 FlatList 时,并没有出现明显卡顿的情况,说明FlatList 在优化方面做得还是不错的,通过 Instrument 来看帧率保存35以上

总结:通过上述对比发现,RN 在业务处理上已经有了很大的改善,特别是使用 FlatList 之后,快速滚动并没有出现掉帧的情况。但是毕竟是 Native 有自己的优势,在内存方面还是有些优势。包括 ReactNative 还有 Native 两个版本都是没有经过优化的代码,比如 Native 多数据加载方面常用的“离屏渲染”,抛弃 AutoLayout 使用手动计算布局,CoreText 优化文字渲染等,Native优势还比较大的。ReactNative 方面由于 JS 是同一套 代码,可以做到 Android与 iOS 同样,极大减少开发成本,同时减少 DOM结构的复杂程度,更好地划分组件也是能够优化 RN性能。

关于 Animation,我尝试运行了Airbnb开源的的动画库,运行每个动画 Demo,其动画帧率能保持在55以上

其中的红框表示一个动画进行时,动画的帧率,前后会出现帧率低的情况是因为动画结束后,界面静止,没有操作。

我也尝试自己实现 RN 中各种的动画类型,包括自定义下拉刷新动画,Layout 动画,Scroll动画等,发现 RN 的动画性能还是挺不错的。

Cassandra 基础配置

如果在单节点上运行Cassandra,不需要配置,参照Cassandra 安装文档. 如果要做集群配置、又或者Cassandra client和Cassandra节点不在同一个主机上,我们需要对参数进行配置.

Cassandra的配置文件一般都存在

/etc/cassandra

主要属性

大多数配置都在一个yaml文件当中

cassandra.yaml

. 最精简的配置需要包含以下几项:

  • cluster_name

    : 节点名

  • seeds

    : a comma separated list of the IP addresses of your cluster seeds.逗号分隔的一些列ip地址, 节点通过seeds配置中的ip,了解整个集群的拓扑结构.

  • storage_port

    : you don’t necessarily need to change this but make sure that there are no firewalls blocking this port. 未必需要改动,但是无比保证此端口不被本级防火墙阻拦,数据和命令都走本端口.

  • listen_address

    : the IP address of your node, this is what allows other nodes to communicate with this node so it is important that you change it. Alternatively, you can set

    listen_interface

    to tell Cassandra which interface to use, and consecutively which address to use. Set only one, not both. 其他节点通过此端口和本节点通讯. 所以需要改一下

  • native_transport_port

    : as for storage_port, make sure this port is not blocked by firewalls as clients will communicate with Cassandra on this port. 这个是cassandra client和cluster的通讯节点. client和cluster通讯有thrift协议和native协议两种,native更强大一些

Changing the location of directories

The following yaml properties control the location of directories:

下面几个yaml属性配置了目录位置:

  • data_file_directories

    : 多个数据文件目录.

  • commitlog_directory

    : 提交日志文件所在目录.

  • saved_caches_directory

    : 存储日之所在目录

  • hints_directory

    :提示信息目录所在.

处于性能考虑一般会把提交日之和数据文件放到同一个磁盘

环境参数配置

JVM 相关设置,比如heap size, 在

cassandra-env.sh

中,如果想额外指定JVM命令行参数,可以在

JVM_OPTS

环境变量中配置,Cassandra启动的时候,这些参数会传到JVM.

日志

日志相关配置在

logback.xml

文件中, 默认的日志级别是

INFO

, 输出的目标文件为

system.log

, 如果是

DEBUG

级别则日志会输出到文件

debug.log

. 如果Cassandra在foreground模式执行,

INFO

级别大的日志会输出到控制台.