zoukankan      html  css  js  c++  java
  • documentFragment 性能优化

    性能优化思考

    优化由来

    <!DOCTYPE html>
    <html>
        <head>
            <title>TODO supply a title</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <script>
              window.onload = function(){
                  var lis = document.getElementsByTagName('li')
                  var list = Array.prototype.map.call(lis, function(el){
                      return {dom: el, text: el.textContent}
                  })
                  console.log(list)
                  var newList = list.concat().reverse()
                  diff(list, newList)
                  //编写一个diff方法,让LI元素也跟着倒过来排列
              }
    
            </script>
        </head>
        <body>
            <div ms-controller='for1'>
                <ul>
                    <li>111</li>
                    <li>222</li>
                    <li>222</li>
                    <li>111</li>
                    <li>333</li>
                </ul>
            </div>
        </body>
    </html>
    

    三种方法

    		  function diff1(list, newList) {
                    document.createDocumentFragment();
                    var len = newList.length;
                    var parentEle = list[0].dom.parentElement;
                    var refEle;
                    refEle = list[0].dom;
                    list.forEach(function(ele,i){
    
                        parentEle.insertBefore( newList[i].dom, refEle);
                    })
    
                }
                function diff2(list, newList) {
                    var frg = document.createDocumentFragment();
                    var container = list[0].dom.parentElement;
                    newList.forEach(function(ele){
                        frg.appendChild(ele.dom)
                    })
    
    
                    container.appendChild( frg );
    
                }
    
                function diff3(list, newList) {
                    var frg = document.createDocumentFragment();
                    var container = list[0].dom.parentElement;
                    newList.forEach(function(ele){
                        var li = document.createElement('li');
                        li.innerText = ele.text;
                        frg.appendChild(li)
                    })
    
                    container.innerHTML = '';
                    container.appendChild( frg );
    
                }	
    

    方法思路

    diff1:
    	简单粗暴,把倒序的DOM逐个插入在第一个LI之前。
    	
    diff2:
    	用documentFragment做了优化,目的是减少reflow
    	
    diff3:
    	第三种,取自虚拟dom的想法,其实多了一步创建DOM元素的
    

    测试结果

    diff1:  821.597ms
    diff2: 1366.079ms
    diff3: 3213.761ms	
    

    结果分析

    第二种比第三种快,原因是重新创建dom的开销。
    第一种比第二种快,就有点想不通了。documentFragment的目的不就是减少reflow吗。猜想chrome做	了优化  
    

    documentFragment

    MDN
    	documentFragment是DOM节点,他不是DOM树的节点。一般的用法是:创建文档片段、追加元素到文档片段然后把文档片段插入到DOM树中。在DOM树中,文档片段被文档的子节点替换。
    	因为,documentFragment在内存中,操作documentFragment不会导致页面reflow. 因此,有助于性能的提高。   	          
    

    john关于文档片段的研究,不过研究的浏览器都比较老

    google的性能优化建议

  • 相关阅读:
    iOS (封装)一句话调用系统的alertView和alertController
    仿写从iOS8开始支持的UIAlertController:BGAAlertController-Android
    iOS开发之UIAlertController的适配
    使用dispatch_once实现单例
    关于内存警告
    Android之drawable state各个属性具体解释
    vijos 1115 火星人
    X-UA-Compatible IE 浏览器默认文档模式设置
    POJ--1300--Door Man【推断无向图欧拉通路】
    sharepoint 2013 附件控件FileUpload怎样检验是否为图片的方法
  • 原文地址:https://www.cnblogs.com/diaoxiong/p/5784737.html
Copyright © 2011-2022 走看看