正如 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