chromium/third_party/blink/perf_tests/mutation/remove-child-deep.html

<!DOCTYPE html>
<body>
<pre id="log"></pre>
<script src="../resources/runner.js"></script>
<div id="sandbox" style="display:none"></div>
<script>
var sandbox = document.getElementById('sandbox');
var node = sandbox;
for (var i = 0; i < 200; ++i)
    node = node.appendChild(document.createElement('div'));
var observing = false;

var observer = new WebKitMutationObserver(listener);
var tickledSpan = document.createElement('span');
observer.observe(tickledSpan, {attributes: true});

function resetState() {
    window.start = null;
    window.numRuns = 25;
    window.times = [];
}

function runAgain() {
    tickledSpan.setAttribute('data-foo', numRuns);
}

function hideFromObservation(func) {
    if (observing)
        observer.disconnect();
    func();
    if (observing)
        observer.observe(sandbox, {childList: true, subtree: true});
}

function listener(mutations) {
    if (start) {
        var time = Date.now() - start;
        times.push(time);
        PerfTestRunner.log(time);
    }
    if (numRuns-- >= 0) {
        runAgain();
        hideFromObservation(function() {
            for (var i = 0; i < 50000; ++i)
                node.appendChild(document.createElement('div'));
        });
        start = Date.now();
        while (node.firstChild)
            node.removeChild(node.firstChild);
    } else {
        PerfTestRunner.logStatistics(times);
        if (!observing) {
            observing = true;
            resetState();
            PerfTestRunner.log('\n------------\n');
            PerfTestRunner.log('Running ' + numRuns + ' times with observation');
            setTimeout(runAgain, 0);
        }
    }
}

resetState();
PerfTestRunner.log('Running ' + numRuns + ' times without observation');
window.addEventListener('load', runAgain);
</script>
</body>