kraken icon indicating copy to clipboard operation
kraken copied to clipboard

使用 double-linked-list 重构 dart 层 Node 节点操作

Open andycall opened this issue 3 years ago • 0 comments

使用场景 | Use case

Dart 侧 Element 层插入节点采用的数据结构是数组结构。然而在常见的业务场景中, appendChild 和 insertBefore 的操作非常常见。 这类的操作会不断触发 List 进行扩容,进而复制整个数组。

而数组带来的快速随机访问特性似乎一直没起到任何作用。因此采用双向链表数据结构更加简单高效。

  List<Node> childNodes = [];

Chrome 的 Node 也是使用双向链表实现,并没有类似数组的数据结构。

并且 Chrome 缓存了最近的节点,用于快速节点访问操作。 https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/dom/collection_index_cache.h;drc=5add3c3f90d578d55ca28dd06bd296654d96c3b8;bpv=0;bpt=1;l=89

双向链表结构 https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/dom/node.h;l=206;bpv=0;bpt=0

C++ 层会先实现一遍,Dart 层也要进行跟进。

andycall avatar Dec 22 '21 12:12 andycall