【发布时间】:2025-12-10 18:55:02
【问题描述】:
考虑将lis 附加到ul 的这三个版本:
朴素版(慢 20%):
var ul = document.getElementById('targetUl');
for (var i = 0; i < 200; i++) {
var li = document.createElement('li');
li.innerHTML = Math.random();
ul.appendChild(li);
}
使用 JavaScript 片段(慢 4%):
var ul = document.getElementById('targetUl'),
fragment = document.createDocumentFragment();
for (var i = 0; i < 200; i++) {
var li = document.createElement('li');
li.innerHTML = Math.random();
fragment.appendChild(li);
}
ul.appendChild(fragment);
追加到尚未在 DOM 中的元素(快 1.26%):
var ul = document.createElement('ul'),
div = document.getElementById('targetDiv');
for (var i = 0; i < 200; i++) {
var li = document.createElement('li');
li.innerHTML = Math.random();
ul.appendChild(li);
}
div.appendChild(ul);
为什么追加到内存中的 DOM 元素比追加到 Fragment 更快?由于fragment 是为此唯一目的而创建的,它不应该更快吗?除了不必在追加之前包含*元素之外,使用fragment 对内存中保存的元素有什么好处吗?
检查来自 jsperf 的测试输出:http://jsperf.com/javascript-fragments-tests
【问题讨论】:
-
不参考底层代码或设计,你得到的任何答案都是猜测。我的观点是,片段是任何 DOM 元素的通用容器,而 UL 非常具体,只能有 LI 子元素,所以当元素被附加时片段必须做的工作,而 UL 没有。我认为 ±4% 不显着。
-
不要太担心微优化
-
怎样才能让 Fragment 更快? (假设性地询问在 Fragment 与常规 DOM 元素中可以进行哪些优化)
-
@JKillian 它应该是为这个精确操作设计的最小文档对象。我不确定他们可以使用哪些优化来实现这一点。
标签: javascript