regularjs/regular

List指令 使用的LS算法 在应付超大数组时 有性能问题

Closed this issue · 2 comments

目前版本 当你 没有选择 track by 语法时 (强烈建议0.4.0版本后的开发者使用track by 语法),比如

{#list Expression as item}   // 普通


{#list Expression as item by item_index} // 而非高性能的 track by 语法 

Regularjs 是使用的 莱文斯坦距离来解决的两数组的diff.

众所周知, 使用LS算法可以计算出最小编辑距离, 使得我们可以以最小的DOM代价来更新VIEW. 因为一般意义上,尽量规避DOM操作是一个性能的保证, 但是其实这是视场景而定。。。

这个算法的复杂度是 O(n^2) , 当数组大小超过一定数值时,性能会受到平方级的影响.

所以后续版本必须在大数组时,做必要的优化, 在dom操作和数组运算之间找一个平衡点

也许会在0.5.0版本解决, 当然这个并不影响开发者使用Regularjs, 一切都是内部改动.

track by有啥用呢,不是不加也可以取到itemindex吗? 发自网易邮箱大师 在2015年12月07日 14:37 ,ZhengHaibo写道: 目前版本 当你 __没有选择 track by 语法时 __ (强烈建议0.4.0版本后的开发者使用track by 语法),比如 {#list Expression as item} // 普通

{#list Expression as item by item_index} // 而非高性能的 track by 语法 Regularjs 是使用的 莱文斯坦距离来解决的两数组的diff. 众所周知, 使用LS算法可以计算出最小编辑距离, 使得我们可以以最小的DOM代价来更新VIEW. 因为一般意义上,尽量规避DOM操作是一个性能的保证, 但是其实这是视场景而定。。。 这个算法的复杂度是 O(n^2) , 但数组大小超过一定数值时,性能会受到平方级的影响. 所以后续版本必须在大数组时,做必要的优化, 在dom操作和数组运算之间找一个平衡点。 也许会在0.5.0版本解决, 当然这个并不影响开发者使用Regularjs, 一切都是内部改动. — Reply to this email directly or view it on GitHub.

@DophinL 仅仅是一个提高性能的途径。 原来的方式当然是完全没问题的, 这个部分的说明, 我还没有写进文档里。99%的情况你可以直接用by 描述 来代替原来的写法, 并获得不错的性能提升。 之所以还要加 by item_index 这个描述符, 就是为了那1%的可能性