博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RecyclerView 差异更新(diff)
阅读量:6273 次
发布时间:2019-06-22

本文共 938 字,大约阅读时间需要 3 分钟。

hot3.png

    React中最神奇的部分莫过于虚拟DOM,以及其高效的Diff算法,为这个框架如此流行的基石。在React中,构建UI界面的思路是由当前状态决定界面。前后两个状态就对应两套界面,然后由React来比较两个界面的区别,这就需要对DOM树进行Diff算法分析。即给定任意两棵树,找到最少的转换步骤。但是复杂度需要O(n^3),这显然无法满足性能要求。要达到每次界面都可以整体刷新界面的目的,势必需要对算法进行优化。这看上去非常有难度,然而Facebook工程师却做到了,他们结合Web界面的特点做出了两个简单的假设,使得Diff算法复杂度直接降低到O(n)。

    android support-library 24.2.0版本提供了一个新的  类可以计算两个集合之间的差异,并分派适合  使用的更新操作列表。DiffUtil使用的是""算法。来看看这个算法的有啥优势

该算法为空间优化, 使用 o (n) 空间来查找两个列表之间的加法和移除操作的最小数目。它有 o (n + D^2) 预期的时间性能, 其中 d 是编辑长度。如果启用了移动检测, 则需要额外的 o (n ^ 2) 时间, 其中 n 是添加和移除项的总数。如果您的列表已按相同的约束 (例如, 为list创建的时间戳) 排序, 则可以禁用移动检测以提高性能。算法的实际运行时显著取决于列表中的更改数和比较方法的开销。下面是一些平均运行时间, 供参考: (测试列表由随机 uuid 字符串组成, 测试运行在与 m 的连结5X 上)百项和十个修改: avg: 0.39 毫秒, 中值: 100 ms百项和百修改: 中位数: ms百项和百修改不移动: 2.09 毫秒, 中值: 2.06 毫秒1000项和50修改: avg: 4.67 毫秒, 中值: 4.59 毫秒1000项和50修改没有移动: avg: 中中值: ms1000项目和200修改: 27.07 毫秒, 中值: 26.92 毫秒1000项和200修改不移动: 13.54 毫秒, 中值: 13.36 毫秒由于实现约束, 列表的最大大小可以是两大。

哈哈,好厉害啊

转载于:https://my.oschina.net/droidwolf/blog/877427

你可能感兴趣的文章
FTP 服务器上传文件 553 Could not create file
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
知识点002-yum的配置文件
查看>>
学习 Git(使用手册)
查看>>
javascript 中出现missing ) after argument list的错误
查看>>