Skip to content

Latest commit

 

History

History
32 lines (17 loc) · 1.62 KB

09.精读Immutable结构共享.md

File metadata and controls

32 lines (17 loc) · 1.62 KB

009.精读 Immutable 结构共享.md

前言

  • mobx-state-tree 发布, 实现 mutable 到 immutable 数据流的转变(可变数据流到不可变数据流) 同时也是将事务性、可追溯星和依赖追踪特性的结合

概要

  • Object.assign() 作用大对象速度较慢,性能损失在"结构共享"操作需要遍历大对象的几乎所有属性,引用操作耗时长。
  • 解决方法就是减少引用指向的操作数量,需要一种设计巧妙的树形结构打平的引用建立深度vector tries: hash 后减少树的深度,按数量打平深度,广度拉开,路径唯一,此类结构共享的核心就是以空间换时间

Vector trie

  • 使用二叉树 将所有值按照顺序 从左到右存放于叶子节点,需要更新数据时,将其更新路径上的节点生成新的对象,没改变节点继续共用。

Hash maps trie

  • ImmutableJS 对于 map 通过树宽和树高的压缩,将其压缩聚合成一个节点,移除同级的空节点(个人理解就是在 Vector trie 的基础上将没用到的叶子节点压缩去掉)

QA: Object.assgin 是否可以代替 Immutable

  • 结构共享二者都可以实现,在庞大对象时使用后者更合适

QA: Map 性能比 Object.assign 好,是否可以代替 Immutable

  • 性能上的确可以,但是结合 redux 使用则无法代替

summary

  • 数据结构共享真正达到可用层次,需要借助 Hash maps tries 和 Vector tries 的帮助

  • 大部分情况下可以使用 Object.assgin 代替 ImmutableJS,只要不怕深度赋值的麻烦语法, 在数据量巨大的字段上模块一使用 ImmutableJs 提高性能