Browser Page Performance: Detached DOM vs display: none; (v4)

Revision 4 of this benchmark created by Oussama on


Description

Is there a performance hit on a page with a lot of elements that are "display: none", versus a lot of elements that are detached from the DOM?

The performance I'm looking for is not the hide/show performance, but instead, I'm interested in the rest of the page's performance when there are a large number of hidden elements.

Preparation HTML

<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>


<div style="overflow: hidden; height: 50px;">
  <div id="clone-container">
    <div id="clone-and-hide-me" class="clone">
        This element isn't empty. <p class="asdf">bacon ipsum</p> dolor <input type="text" value="sit amet" />
    </div>
  </div>
</div>

<script>
  var clone = $('#clone-and-hide-me').remove();
  var cloneContainer = $('#clone-container');
  function setupTest(testNumber) {
    switch (testNumber) {
      case 1:
        break;
      case 2:
        createClones().hide();
        break;
      case 3:
        window.clonesStayInMemory = createClones().remove();
        break;
      default:
        throw new Error("too many tests");
    }
  }
  function createClones() {
    var cloneCount = 10000;
    var clones = new Elements([]);
    for (var i = 0; i < cloneCount; i++) {
      clones.push(clone.clone());
    }
    cloneContainer.empty().adopt(clones);
    return clones;
  };

  var measureCount = 0;
  var currentTestNumber = 0;
  var measureSomething = function(testNumber) {
    if (testNumber != currentTestNumber) {
        currentTestNumber = testNumber;
        setupTest(testNumber);
    }
    measureCount++;
    cloneContainer.css('height', 100 + (measureCount % 100));
    var readTheHeight = cloneContainer.offsetHeight + 0;
  }

</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Using nothing (for base)
measureSomething(1);
ready
Using "hide"
measureSomething(2);
ready
Using "remove"
measureSomething(3)
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.

  • Revision 2: published by Scott Rippey on
  • Revision 3: published by Oussama on
  • Revision 4: published by Oussama on