【问题标题】:why a tiny reordering of DOM Read/Write operations causes a huge performance difference为什么 DOM 读/写操作的微小重新排序会导致巨大的性能差异
【发布时间】:2013-10-15 13:39:20
【问题描述】:

以下代码说明了问题,改变读/写的顺序导致执行时间有很大差异(使用Chrome、Firefox和IE测试):

// read->write->read->write...
function clearSlow(divs){
    Array.prototype.forEach.call(divs, function(div) {
        contents.push(div.clientWidth);
        div.style.width = "10px";
    });
}
// read->read->...->write->write...
function clearFast(divs){
    Array.prototype.forEach.call(divs, function(div) {
        contents.push(div.clientWidth);
    });
    Array.prototype.forEach.call(divs, function(div) {
        div.style.width = "10px";
    });
}

这是完整示例的 JSFiddle http://jsfiddle.net/Dq3KZ/2/

我的 n=100 的结果:
慢速版本:~35ms
快速版本:~2ms

对于 n=1000:
慢速版:~2000ms
快速版本:~25ms

我认为这与每种情况下的浏览器重排次数有关。在慢速场景中,每次写入操作都会发生回流。但是,在快速方案中,回流仅在最后发生一次。但我不确定,也不明白为什么它会那样工作(当操作是独立的时)。

编辑:我使用 InnerText 属性而不是 clientWidthStyle.Width ,我在使用 Google Chrome (http://jsfiddle.net/pindexis/CW2BF/7/) 时得到了相同的行为。但是,当使用InnerHTML 时,几乎没有区别(http://jsfiddle.net/pindexis/8E5Yj/)。

Edit2:我已经为感兴趣的人开启了关于 innerHTML/innerText 问题的讨论:why does replacing InnerHTML with innerText causes >15X drop in performance

【问题讨论】:

    标签: javascript performance google-chrome firefox dom


    【解决方案1】:

    这些操作不是独立的。

    当样式或内容大小发生更改并且需要位置或尺寸时,必须发生重排,因为您请求尺寸或因为必须更新屏幕(当您的代码完成时)。 p>

    div.clientWidth 是一个隐藏的函数调用。当您请求此值时,实际上您请求的是最新值,因此,随着样式的更改,您会立即触发重排。

    在“快速”的情况下,在重绘屏幕或您请求尺寸之前,没有理由进行重排。在这种情况下,实际上只需要一次回流。

    【讨论】:

    • 所以当请求下一个divclientWidth 时,是改变前一个div 的宽度会触发回流吗?
    • 更改 div 宽度会更改回流状态(请参阅www-archive.mozilla.org/newlayout/doc/reflow.html)。但回流不必立即进行,只有在需要结果时才可以。当您不请求宽度时,在线程完成之前不会发生回流(请注意,您不能真正依赖这一点,我记得 Opera 注释说如果脚本执行时间很长,回流可能会更快发生) .由于回流并不总是整个页面,因此更难预测会发生什么。
    • 请记住,所有这些都取决于实现,但显然会发生变化并立即循环读取是一种最坏的情况。
    • 但使用 InnerText 而不是 clientWidth 会产生相同的结果(在 chrome 中,请参阅我的编辑)。我认为在这种情况下不需要维度。
    • 好吧,如果你改变文字,你可能会改变“框架”的尺寸。
    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 2015-09-12
    • 1970-01-01
    • 2013-12-19
    • 2021-10-27
    • 2019-04-21
    • 2010-10-15
    • 2015-06-04
    相关资源
    最近更新 更多