我是FE,也是Fe

          前端來源于不斷的點滴積累。我一直在努力。

          統計

          留言簿(15)

          閱讀排行榜

          評論排行榜

          datagrid性能(一):性能問題何來?

          使用javascript封裝的一個datagrid控件時,可能會提出這個問題,在datagrid里面顯示1000條數據,而且需要綁定其click,hover,dblclick事件。(可能你會覺得這個需求有點無聊。為什么要顯示1000行數據,可以分頁的。我最開始也這么想,但是分頁有些問題解決不了,比如,我們需要選中多條數據做一個操作,可能我要選的記錄在第一頁,第n頁。這樣還需要記錄行選中狀態。而且可能在分頁查詢的時候數據已經發生了更改。比如當你翻頁到第二頁的時候,第一頁選中的數據已經刪除了。這樣選中的數據已經是“臟數據”了。)


          javascript執行很慢的時候瀏覽器會提示腳本執行過慢甚至假死(還是要鄙視一下IE6執行js的速度)。但是上面的問題很有可能就會出現瀏覽器奔潰的情況。所以在實現這個功能,不得不審視一下現在的實現。

          看看下面的jQuery代碼,類似于現有的寫法:

          $(function(){
                      
          var arr = [];

                      
          var date1 =(new Date()).getTime();
                      
          for (var i=0;i<1000 ; i++){
                          arr.push(
          "<tr><td>"+(new Date())+"</td><td>"+(new Date())+"</td><td>"+(new Date())+"</td><td>"+(new Date())+"</td><td>"+(new Date())+"</td></tr>");
                      }
                      
          var $rows= $(arr.join("")).appendTo("#tablebody");
                      
          var date2 =(new Date()).getTime();
                      
          //date2-date1 =453ms
                      
                      
          //事件處理 406ms
                      $rows.click(function(){
                          $(
          "#tablebody .highlight").removeClass("highlight");
                          
          this.className="highlight";
                      }).hover(
          function(){
                          
          this.className="hover";
                      },
          function(){
                          
          this.className="";
                      }).dblclick(
          function(){
                          alert(
          "dblclick");
                      });
                      
          var date3 =(new Date()).getTime();

                      alert((date2
          -date1)+"\n"+(date3-date2));
                  });

          這段代碼在table中新增1000行,然后把監聽每行的click,hover,dblclick事件。這個代碼在IE8上執行時間是0.95s左右(具體時間因環境而異)。0.95的時間去顯示數據確實是讓人難以接受。這個時間可能是后臺數據庫查詢的時間。這個時間其實還有優化的空間。

          第一部分的DOM操作已經是比較快的了。這個時間會跟cell中顯示的內容直接相關,能夠的做的性能優化貌似都做了。jQuery中的appendTo在DOM操作性能上應該難以超越了。令我驚訝的是,綁定事件的時間竟然會有406ms。與DOM操作時間同一個量級。我用了幾種方法做了對比:

          //第一種情況:復雜的事件處理 406ms
                      $rows.click(function(){
                          $(
          "#tablebody .highlight").removeClass("highlight");
                          
          this.className="highlight";
                      }).hover(
          function(){
                          
          this.className="hover";
                      },
          function(){
                          
          this.className="";
                      }).dblclick(
          function(){
                          alert(
          "dblclick");
                      });

          //第二種情況:簡單事件處理 141ms
                      $rows.click(function(){
                          alert(
          "clicked");
                      }).dblclick(
          function(){
                          alert(
          "dblclick");
                      });


          //第三種情況:使用原生的javascript事件綁定 62ms
                      var rows= document.getElementById("tablebody").getElementsByTagName("tr");
                      
          for (var i=0;i<rows.length ; i++){
                          (
          function (row){
                              row.onclick
          = function(){
                                  alert(
          "clicked");
                              };
                              row.ondblclick
          = function(){
                                  alert(
          "dblclicked");
                              };
                          })(rows[i]);
                      }


          //第四種情況:只是用jquery做選擇器 47ms
                      $rows.each(function(){
                          
          this.onclick= function(){
                              alert(
          "clicked");
                          };
                          
          this.ondblclick= function(){
                              alert(
          "dblclicked");
                          };
                      });

          第一種情況與第二種情況的對比可以發現事件綁定的越少,時間越短。
          第二種情況與第三種情況的對比可以發現使用原生的javascript事件綁定會比jQuery時間短。這個貌似有點不好解釋,jQuery封裝的目的可能更在于減少代碼量。jQuery的事件綁定比原生的事件綁定會有這么大的差別也是讓我驚訝的。
          第三種情況其實多做了一次DOM選擇,因為$rows其實就是新增行jQuery對象。所以直接用each方法遍歷綁定事件,時間是最短的。

          總的來說,性能問題不僅僅在于我們理解的DOM操作上面,事件的綁定其實也是很關乎性能的。大家平時是怎么解決這種問題了,歡迎交流。上面的代碼下載

          posted on 2011-01-18 10:25 衡鋒 閱讀(2246) 評論(5)  編輯  收藏 所屬分類: javascriptJqueryWeb開發

          評論

          # re: datagrid性能(一):性能問題何來? 2011-01-18 12:16 凌晨風

          其實沒必要那么較真,一般大數據量的業務操作很少,現實中也是很少,分頁就是解決這個的,而且你完全可以說服客戶分頁的好處  回復  更多評論   

          # re: datagrid性能(一):性能問題何來? 2011-01-18 12:26 陽衡鋒

          @凌晨風
          大多數還是分頁。有些地方還是不方便。期待下文吧。呵呵  回復  更多評論   

          # re: datagrid性能(一):性能問題何來? 2011-01-18 12:29 凌晨風

          @陽衡鋒
          哈哈 ,期待下文!其實還有一種分頁方式就是判斷滾動條的距離,完全可以解決大數據量的問題  回復  更多評論   

          # re: datagrid性能(一):性能問題何來? 2011-02-28 17:39 wjk

          看下jQuery的源碼不久知道了 jQuery為了方便開發做了很多額外的事情  回復  更多評論   

          # re: datagrid性能(一):性能問題何來? 2011-09-16 08:24 tb

          恩 比較不錯 值得學習   回復  更多評論   

          主站蜘蛛池模板: 灵川县| 东丰县| 灵武市| 松滋市| 梁平县| 茌平县| 澄城县| 塘沽区| 文登市| 金堂县| 固原市| 名山县| 错那县| 茶陵县| 衡东县| 鄂尔多斯市| 孟村| 赫章县| 福鼎市| 大石桥市| 阿城市| 开远市| 汝州市| 丰宁| 郧西县| 洪洞县| 边坝县| 桦川县| 六枝特区| 新乡市| 志丹县| 呼伦贝尔市| 资源县| 玛纳斯县| 金门县| 光山县| 浏阳市| 腾冲县| 巴楚县| 宁陕县| 西宁市|