リンクと同じ形で、Execlのようにフィルタをする機能を実装してみたのですが、表示データ量が多い場合(横20個×縦1300個)に処理に時間がかかってしまいます。
処理速度アップを図るためには、どのような策があるか教えていただきたいです。
サーバー側はphpとなっております。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
tFilterGo()
の実装が非常にまずいです。
js
1function tFilterGo(){ 2 ... 3 for(var i=gTfStartRow; i < wTR.length; i++){ 4 5 var wVal = trim(wTR[i].cells[wCol].innerText.toString()); 6 7 // --- チェックボックス選択によるフィルタ ---------------- 8 ... 9 wTR[i].setAttribute('cmanFilterNone',''); 10 11 // --- 抽出文字によるフィルタ ---------------------------- 12 ... 13 wTR[i].setAttribute('cmanFilterNone',''); 14 }
innerText
は再レイアウトを強制します。ループの中で スタイルに影響する cmanFilterNone
属性の更新と innerText
の両方を実施しているため、ループ毎に巨大なテーブルの再レイアウトが行われていることになります。
innerText
を textContent
などに変更すべきです。
また、巨大テーブルの再レイアウトにかかる時間を短縮するには、各セルの幅を固定しておくと効果的です。
投稿2022/01/09 15:26
総合スコア21695
0
処理速度が上がるわけではないですが、ユーザーの体感としては、以下のように非同期処理にするとかなり改善するのでは。
js
1 if (!wAll.checked) { 2 for (let i = gTfStartRow; i < wTR.length; i++) { // 変更 3 var wVal = wTR[i].cells[wCol].innerText.toString().trim(); 4 5 if (wItemSave.includes(wVal)) { 6 } 7 else { 8 setTimeout(() => { // 変更 9 wTR[i].setAttribute('cmanFilterNone', ''); // 変更 10 }, 0); // 変更
さて、yambejpさんのご回答にある通り、計算量オーダーを減らすことは難しそうです。
ただ、tFilterGo関数の処理を見ると、フィルタをかけるたびに全ての非表示を表示に戻してから、全ての列のフィルタごとに全ての行をチェックしているようです。
これは、列×行の数だけ処理をしていますので、これを行の数に近づければ少しマシになるかと思います。
たとえば、
js
1 for (var i = gTfStartRow; i < wTR.length; i++) { 2 3 var wVal = wTR[i].cells[wCol].innerText.toString().trim(); 4 5 // --- チェックボックス選択によるフィルタ ---------------- 6 if (!wAll.checked) {
↑ここでは、全ての行を舐めながらフィルタの状態をチェックしていますが、どの行でもwAll.checked
の状態は変わることがないはずなので、これはムダでしょう。
投稿2022/01/08 01:59
総合スコア36960
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/08 02:16
2022/01/09 15:30
2022/01/11 00:43 編集
2022/01/11 07:31
0
描画に時間がかかってるんですかね。
画面内で見えてる部分だけ書き出すとはどうでしょうか
投稿2022/01/07 07:33
総合スコア257
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/07 07:55
2022/01/07 09:56
0
データ量が多いなら処理時間がかかるのは仕方ないでしょう
ちゃんとやるならデータはサーバー側にRDBなどで管理させページングや遅延読み込みなどで処理をしてみてください
投稿2022/01/07 07:32
総合スコア116724
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。