2017-03-05 80 views
0

大量編集(一度に100行のインライン編集)を行うと、free-jqgridの最新バージョンのヘルプが必要です。 JQGrid 4.3.1ではとても速かったです。free-jqgrid 4.13.6にアップグレードした後は、非常に遅いです。私は同様の例を作成しました。このスタンドアロンの例では、パフォーマンスは悪くありません。しかし、なぜ私のアプリケーションでインライン編集を行うのに時間がかかるのか分かりません。どんなヒントも大きな助けになるでしょう。 この例では、グリッドの左上隅にある複数選択チェックボックスをオンにし、ボタンをクリックします(上部にあります)。基本的にインライン編集を行う際に、すべての要素を考慮して理解することを試みます。free-jqgridでの一括編集パフォーマンス

注:単一行のインライン編集にも2〜3秒かかります。これは4.3.1で本当に速かった。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <title>http://stackoverflow.com/q/27617764/315935</title> 
    <meta name="author" content="Oleg Kiriljuk"> 
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/redmond/jquery-ui.min.css"> 
    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 
    <!--<link rel="stylesheet" href="jqGrid/css/ui.jqgrid.css">--> 
    <link rel="stylesheet" href="http://rawgit.com/free-jqgrid/jqGrid/master/css/ui.jqgrid.css"> 
    <style type="text/css"> 
     html, body { font-size: 75%; } 
    </style> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
    <script type="text/javascript"> 
     $.jgrid = $.jgrid || {}; 
     $.jgrid.no_legacy_api = true; 
     $.jgrid.useJSON = true; 
    </script> 
    <script src="http://rawgit.com/free-jqgrid/jqGrid/master/js/jquery.jqgrid.src.js"></script> 
    <!--<script src="jqGrid/js/jquery.jqGrid.src.js"></script>--> 
    <script type="text/javascript"> 
    //<![CDATA[ 
     /*global $ */ 
     /*jslint eqeq: true, browser: true, plusplus: true */ 
     $(function() { 
      "use strict"; 
      var $grid = $("#list"), 
       gridData, 
       startTime, 
       measureTime = false, 
       timeInterval; 

      var date = new Date(), t = Object.prototype.toString.call(date), t1 = String(date); 

      //alert("start to generate the data"); 
      // gridData = getGridData(100); 
     // console.log(gridData); 
      //alert("start to fill the grid") 
      startTime = new Date(); 
      $grid.jqGrid({ 
       datatype: 'json', 
     url: 'https://api.myjson.com/bins/efhbt', 
     mtype: 'GET', 
       colNames: ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'll', 'mm'], 
     colModel: [ 
        { name: "aa", label: "c01" }, 
        { name: "bb", label: "c02" }, 
        { name: "cc", label: "c03" }, 
        { name: "dd", label: "c04" }, 
        { name: "ee", label: "c05" }, 
        { name: "ff", label: "c06" }, 
        { name: "gg", label: "c07", editable: true, stype: 'select', formatter: 'select', 
      edittype: 'select', editoptions: { 
       value: 'Select:Select;Y:Yes;N:No', 
       multiple: false 
      } 
      }, 
        { name: "hh", label: "c08", editable: true, stype: 'select', formatter: 'select', 
      edittype: 'select', editoptions: { 
       value: 'Select:Select;Y:Yes;N:No', 
       multiple: false 
      } 
      }, 
        { name: "ii", label: "c09", editable: true, stype: 'select', formatter: 'select', 
      edittype: 'select', editoptions: { 
       value: 'Select:Select;Y:Yes;N:No', 
       multiple: false 
      } 
      }, 
        { name: "jj", label: "c10", editable: true }, 
        { name: "kk", label: "c11", editable: true }, 
        { name: "ll", label: "c12", editable: true }, 
        { name: "mm", label: "c13", editable: true } 
       ], 
       cmTemplate: { width: 100, autoResizable: true }, 
       rowNum: 1000, 
     records: 1000, 
       rownumWidth: 40, 
       rowList: [20, 100, 1000, 10000, "100000:All"], 
       viewrecords: true, 
       rownumbers: true, 
       toppager: false, 
       pager: false, 
       shrinkToFit: false, 
     multiselect: true, 
     editurl: 'clientArray', 
     loadonce: true, 
       onSortCol: function() { 
        startTime = new Date(); 
        measureTime = true; 
       }, 
     /*onSelectRow: function (rowid) { 
        var $self = $(this), 
         savedRow = $self.jqGrid("getGridParam", "savedRow"); 
        if (savedRow.length > 0) { 
         $self.jqGrid("restoreRow", savedRow[0].id); 
        } 
        $self.jqGrid("editRow", rowid); 
       },*/ 
       loadComplete: function() { 
        if (measureTime) { 
         setTimeout(function() { 
          alert("Total loading time: " + timeInterval + "ms"); 
         }, 50); 
         measureTime = false; 
        } 
       }, 
       autoencode: true, 
       caption: "Shows the performance of resizing. Make double-click on the column resizer" 
      }).jqGrid("filterToolbar", { 
        beforeSearch: function() { 
         startTime = new Date(); 
         measureTime = true; 
         return false; // allow filtering 
        } 
      }).jqGrid("gridResize"); 

      timeInterval = new Date() - startTime; 
      setTimeout(function() { 
       // alert("Total time: " + timeInterval + "ms"); 
      }, 50); 




     // On Click Of Button 
     $("#Change_Value").click(function() { 
     var v = $("#name").val(); 
     var myGrid = $("#list"); 
     var selRowIds = myGrid.jqGrid("getGridParam", "selarrrow"); 
     //alert(selRowId.length); 
     for (var i = 0; i < selRowIds.length; i++) { 
      //rowData = myGrid.jqGrid("getLocalRow", selRowIds[i]); 
      // one can uses the data here 
      myGrid.jqGrid("editRow", selRowIds[i], true); 
     } 
     }); 


     }); 
    //]]> 
    </script> 
</head> 
<body> 
    <div> 
    <input type="text" name="name" id="name" /> 
    <input type="button" name="Change_Value" id="Change_Value" value="Change Value" /> 
    </div> 
    <div> 
    <table id="list"></table> 

    </div> 
</body> 
</html> 

答えて

1

それは一つの要素のすべての変更は、すべての既存のWebブラウザreflowに従うページとの変化の多くを生成するので、「質量の編集」(一度に100行のインライン編集は)一般的には悪いです要素。さらに、100行のグリッドを表示すると、(モニタの自然な制限のために)約25だけがユーザに見えるため、パフォーマンスがさらに低下する。

myGrid.hide(); // !!! new line 
for (var i = 0; i < selRowIds.length; i++) { 
    myGrid.jqGrid("editRow", selRowIds[i], true); 
} 
myGrid.show(); // !!! new line 

あなたは25行でローカルページングを使用する場合は、のような:

は、私はちょうど「マス編集」の後に「質量の編集」とjQuery.showjQuery.hideのコールが含まれてanother one、とthe initial demoのパフォーマンスを比較しますthe next demoに追加すると、ページのパフォーマンスがさらに向上します。最初のデモで100行の編集を開始するのは私のテストでは約1065ミリ秒、前に非表示のグリッドを編集したデモでは330ミリ秒、25行(ローカルページング)で90ミリ秒かかる。

UPDATE:あなたはグリッドに固定された列を使用する場合、あなたは、あなたがeditRowを呼び出すループ、前destroyFrozenColumnsの呼び出しによって固定された列を破壊し、その後setFrozenColumnsの新しいコールによって固定された列を再作成する必要があります。さらにパフォーマンスを向上させる必要があります。

+0

100行を表示することは本当に悪い考えです。私の場合、検索結果には約5000行あります。私たちは100行を表示する必要があるクライアントごとにSi。今私の関心事は、4.13にアップグレードした後、パフォーマンスが遅すぎるということです。それで、一度に100行ずつ速くするために私ができることを理解しようとしています。私はshow/hideで試してみて、あなたの投稿を続けていきます。ありがとう。 – SKumar

+0

はい、より良いパフォーマンスがあります。私は(実際には技術的に理解しようとしているのですが)隠れているだけでこれがどうやって起こるのだろうと思っています。それに感謝します。しかし、私はまだ私たちの生産/ステージング環境では、同じ量のファイルがDEVより速いことを見ています。注:すべてのハードウェア構成は同じです。また、凍った柱の高さに問題があることもわかります。すべてのローズを編集した後、DIV(フリーズコラム)の高さはteグリッドより約20pxほど高くなります。私はデモの例と更新でそれを試してみます。 – SKumar

+0

@SKumar:あなたは大歓迎です! **ウェブブラウザのリフロー**についての[記事](https://developers.google.com/speed/articles/reflow)を読んでいますか?ページ上に複数の変更があった場合のパフォーマンスが低下する理由を説明しています。隠された要素の変更は、リフロージョブの一部を削減します。グリッドでフリーズしたカラムを使用する場合は、 'editRow'を呼び出すループの前に' destroyFrozenColumns'をコールしてフリーズしたカラムを破棄し、 'setFrozenColumns'の新しいコールでフリーズしたカラムを再作成する必要があります。さらにパフォーマンスを向上させる必要があります。 – Oleg

関連する問題