2010-09-25 65 views
1

我意识到每个浏览器都会以不同的方式实现它,但是有没有任何引用或基准指定它?Node.insertBefore的运行时间是多少?

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

编辑的孩子的数量:我跑了一些基准。下面是结果

火狐3.6.10 Linux上

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 

的Chrome 7在Linux上:

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节点,与N元素填充它,然后叫insertBefore(newchild, randominitialchild)M倍。

in dom: false意味着父节点未添加到文档树,所以浏览器不应该重新计算布局(我希望?)

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

回答

1
a.insertBefore(b) 

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

所以是的,你是对的,除非列表是双向链接的,否则这个过程最好带有一个链接列表,O(n)。

0

我假设节点存储在一个双向链表中,在这种情况下insertBefore将需要一段时间。单链表很少用于实际应用。

0

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

相关问题