正如 Bart 所说,innerHTML 总是比 DOM 操作快。
我正在测试 hyperHTML,所以我想我会分享我的结果。实际上,我最初并没有在 CodePen 中运行我的基准测试,有趣的区别在于 jQuery 时间更接近于在 CodePen 中运行的 innerHTML。
铬合金:
创建片段 312.80 毫秒
超HTML 253.10 毫秒
内部HTML 62.70 毫秒
$.append 183.40 毫秒
Chrome(扩展关闭):
创建片段 225.10 毫秒
超HTML 139.80 毫秒
内部HTML 47.80 毫秒
$.append 170.90 毫秒
火狐:
创建片段 141 毫秒
超HTML 84 毫秒
内部HTML 25 毫秒
$.append 90 毫秒
边缘:
创建片段 422.50 毫秒
超HTML 184.60 毫秒
内部HTML 44.00 毫秒
$.append 1629.69 毫秒
IE11:
创建片段 1180.29 毫秒
hyperHTML 13315.59 ms //后备速度慢,IE 很烂
内部HTML 125.70 毫秒
$.append 2382.49 毫秒
我认为这一切都很简单。JavaScript 在解析和创建元素方面不如浏览器快,因为浏览器是特定于机器的编译代码。最好的办法就是交出 HTML 并让浏览器不间断地完成工作。
某些性能差异可能是由于 XSS 检查造成的,这似乎是谨慎的。
function runbench(){
var data = [];
for (var i = 0; i < 10001; i++) {
data.push("<span>" + i + "</span>");
}
var perf=[];
var t0 = performance.now();
var c = document.createDocumentFragment();
for (var i = 0; i < 10001; i++) {
var e = document.createElement("span");
e.innerHTML = data[i];
c.appendChild(e);
}
document.querySelector('#createFragment').appendChild(c);
document.querySelector('#createFragment').classList='done';
var t1 = performance.now();
perf.push(t1-t0);
var t0 = performance.now();
document.querySelector('#innerHTML').innerHTML = data.join('');
document.querySelector('#innerHTML').classList='done';
var t1 = performance.now();
perf.push(t1-t0);
var t0 = performance.now();
$('#jqhtml').html(data.join(''));
document.querySelector('#jqhtml').classList='done';
var t1 = performance.now();
perf.push(t1-t0);
var t0 = performance.now();
$('#jqappend').append(data.join(''));
document.querySelector('#jqappend').classList='done';
var t1 = performance.now();
perf.push(t1-t0);
var t0 = performance.now();
hyperHTML.bind(document.querySelector('#hyperHTML'))
`${data.map(function (item) {
return "<span>" + item + "</span>";
})}`;
document.querySelector('#hyperHTML').classList='done';
var t1 = performance.now();
perf.push(t1-t0);
var stats = [];
stats.push("<table>")
stats.push("<tr><td>createFrag: </td><td>" + perf[0].toFixed(2) + "</td></tr>");
stats.push("<tr><td>innerHTML: </td><td>" + perf[1].toFixed(2) + "</td></tr>");
stats.push("<tr><td>$.html: </td><td>" + perf[2] .toFixed(2) + "</td></tr>");
stats.push("<tr><td>$.append: </td><td>" + perf[3] .toFixed(2) + "</td></tr>");
stats.push("<tr><td>hyperHTML: </td><td>" + perf[4].toFixed(2) + "</td></tr>");
stats.push("</table>");
$('#performance').html(stats.join(''));
document.querySelector('#performance').classList='done';
}
https://codepen.io/jwhooper/pen/GzKwMV