`Node.insertBefore`的运行时是什么?

时间:2010-09-25 23:35:23

标签: html dom

我意识到每个浏览器都会以不同的方式实现它,但有没有指定这个的参考或基准?

最简单的实施似乎是O(n)

的子女数Node 编辑:我运行了一些基准测试。结果如下

Linux上的FireFox 3.6.10

inserted 1000 elements into   1000 elements in  131.44 ms (average over 101 trials,  291.31 ms inc appendChild) while in dom: true
inserted 1000 elements into  10000 elements in  235.91 ms (average over  11 trials, 1311.36 ms inc appendChild) while in dom: true
inserted 1000 elements into 100000 elements in 2349.00 ms (average over  2 trials, 14150.50 ms inc appendChild) while in dom: true

inserted 1000 elements into   1000 elements in  13.13 ms (average over 101 trials,   267.00 ms inc appendChild) while in dom: false
inserted 1000 elements into  10000 elements in  67.45 ms (average over  11 trials,  1517.09 ms inc appendChild) while in dom: false
inserted 1000 elements into 100000 elements in 617.00 ms (average over   2 trials, 15214.50 ms inc appendChild) while in dom: false

Linux上的Chrome 7:

inserted  1000 elements into    1000 elements in      0.65 ms (average over   101 trials,     30.34 ms inc appendChild) while in dom: true
inserted  1000 elements into   10000 elements in      1.55 ms (average over    11 trials,    175.09 ms inc appendChild) while in dom: true
inserted  1000 elements into  100000 elements in     12.00 ms (average over     2 trials,   2255.00 ms inc appendChild) while in dom: true
inserted  1000 elements into    1000 elements in      0.49 ms (average over   101 trials,     41.13 ms inc appendChild) while in dom: false
inserted  1000 elements into   10000 elements in      1.36 ms (average over    11 trials,    301.18 ms inc appendChild) while in dom: false
inserted  1000 elements into  100000 elements in     12.00 ms (average over     2 trials,   2565.50 ms inc appendChild) while in dom: false

我创建了一个dom Node,用N元素填充它,然后调用insertBefore(newchild, randominitialchild) M次。

in dom: false表示父节点未添加到文档树中,因此浏览器不应重新计算布局(我希望?)

结果似乎表明插入是O(n)

3 个答案:

答案 0 :(得分:1)

a.insertBefore(b)

如果节点存储在链表中,那么该过程就像在b之前找到节点一样简单,这需要花费O(n)时间,因为没有向后指针,只有下一个节点指针。然后,我们将b之前的节点的下一个指针更改为a

所以是的,你是对的,除了列表是双重链接之外,该过程最多只需要一个链表的O(n)。

答案 1 :(得分:0)

我假设节点存储在双向链表中,在这种情况下insertBefore将占用恒定时间。单链表在实际应用中很少使用。

答案 2 :(得分:0)

将节点实际添加到树中所花费的时间将是最小的。需要时间的是更新和重新计算布局。