美文网首页React Native学习
FlatList vs ListView性能对比

FlatList vs ListView性能对比

作者: henry_g | 来源:发表于2018-04-07 10:57 被阅读398次

    React Native在0.43版本之前写列表需要使用ListView,ListView存在性能问题,API也不友好,所以官方在0.43版本推出了FlatList,有如下优点:

    • API更加友好和丰富;
    • 性能好很多;

    所以我写了一个长列表Demo来测试下两者性能对比(测试环境是MacBook Air的iphone8plus模拟器,关闭了remotedebug)。

    ListView without removeClippedSubviews vs FlatList:

    • 内存:ListView在上下滚动的时候内存从200M 涨到了1个G 还不止(我觉得ListView最大的性能问题是上下滚动的时候内存不会被回收,会无限增大),但是FlatList无论你怎么滚动,都可以稳定在320M!
    • CPU:ListView在上下滚动的时候CPU峰值达到160%,但是FlatList稳定在50%左右。

    ListView with removeClippedSubviews(ListView开启设置定高并且overflow:hidden即可) vs FlatList:

    • 内存:ListView的峰值是135.8M,FlatList是265M。之所以FlatList高是因为windowSize默认为21,渲染了一些可视区之外的元素所以内存占用较高,当我把windowSize设置为10的时候内存占用降低到了160M。
    • CPU:ListView在上下快速滚动的时候峰值达到200%,但是FlatList峰值最高是80%。(其实CPU峰值和滑动列表速度有关,但是基本上可以看到无论哪种情况ListView的CPU峰值是FlatList的2~3倍左右)

    如果要写出高性能的FlatList需要注意:

    • renderItem中的组件最好是无状态组件,不要放内存state。
    • 使用keyExtractor指定一个key,不要使用索引,尤其是存在列表的增删的情况下。
    • 如果你不需要渲染就知道每一行的高度的话,那么getItemLauout是一个非常有用的优化方案。
    • 使用合适的windowSize在内存和流畅性之间达到平衡。

    相关文章

      网友评论

      • 就是一个春天的花朵:你好,最近也在看rn, 我用从服务器请求数据用flatlist实现了一个长列表,大约30条数据, 每一个item都是只有一个Text标签, 但是从iOS上来看内存都在130-150mb之间, 请问这个数据正常吗, 用原生的写内存估计一半都不到
        henry_g:你好,我认为是正常的,rn占用内存确实比原生高一些。你也可以把代码贴出来,我看下是否还有优化的空间。

      本文标题:FlatList vs ListView性能对比

      本文链接:https://www.haomeiwen.com/subject/jmoehftx.html