0


0

ブラウザをフリーズせずに、Perl CGIプログラムで大きなHTMLテーブルを出力するにはどうすればよいですか?

このPerl CGIプログラムがあり、ユーザーがこのHTMLテーブルで表示するデータの数を選択できるようにします。 私は `foreachを通過します…​ foreach …​ `および各行を印刷します。

3,000行を超えるデータを印刷し、Firefoxウィンドウが応答しなくなるPerl CGIスクリプトに問題があります。 dataTable jqueryもリンクしています。

ブラウザウィンドウの凍結を防ぐために、どのようなアプローチができますか?

3 Answer


3


最も可能性が高いのは、大きなテーブルを表示するときにブラウザーのリソース消費のためにブラウザーウィンドウがフリーズすることです。バックエンドPerl CGIコードとは関係ありません。

これを確認する最も簡単な方法は、log-printステートメントを追加することです(例: STDERRに出力)をCGIスクリプトの最後に追加し、タイムスタンプを出力します。次に、スクリプトを実行し、Webサーバーのログを見て、スクリプトがいつ完了したかを確認します。 ほぼ確実に、非常に高速に完了していることがわかります。

ボトルネックがブラウザであるというもう1つの(信頼性は低い)インジケーターは、OS上のお気に入りのプロセス管理プログラム(TaskManager / ProcessExplorer / ps / top)で消費メモリとCPUを監視していることです。

さて、ブラウザの表示に関する問題に関して、Wrikkenはいくつかの良い提案をしました。 非常に大きなテーブルでの複雑なイベント処理(jQueryを含む)を避けることは、できれば良い考えです。可能な場合、IDの代わりにクラスを使用します。

他のいくつかは:

  • すべての列に事前定義されたピクセル幅を使用します(理想的にはすべての行を 掘り出し物)。 ブラウザは、テーブルをレンダリングするときに、すべての行についてオンザフライで計算する必要がない場合、非常に高速に動作します。

  • TABLEではなくDIVベースのテーブルに切り替えることを検討してください。 正直に言うと それが賢明な速度に役立つかどうかわからない-それは良いSOの質問またはそれ以上であると思います、それを試して、ベンチマークしてください。 ただし、表形式のデータを表示するための哲学的に純粋なソリューションではない場合があります。

  • Wrikkenが言ったように、ページネーション。 ユーザーは3000行のテーブルを処理できません 目もくらむほど高速に印刷されたとしても効率的であるため、実際のスプレッドシートで何らかの方法でフィルター/非表示にしない限り、実際に描画するのはかなり役に立ちません。

'' '' '

わずかな他の可能性があります-生成されるHTMLテキストの純粋なボリュームまでテーブルが非常に大きい場合、遅延の一部です。ネットワーク接続が高速でない場合-これをダウンロードする必要がある可能性があります。

その場合は、非常に簡単にテストできます。テーブル全体をコメントタグで囲みます(「テーブルにコメントタグがない場合」)。 代わりに小さなテキストを印刷してください。 コメントタグが閉じた後。

その後、ページを再実行します。

ブラウザに小さなテキストが非常に高速に表示される場合、テーブルのダウンロードが原因ではなかったことを意味します(CGIスクリプトがボトルネックではないという別の確認も同様です)。あなたは同じ大きなテーブルファイルを生成してダウンロードするが、ブラウザで実際のテーブルをレンダリングしないからです。

一方、コメントアウトされたテーブルを最後までページにダウンロードするのに時間がかかる場合(およびログ印刷によりCGIが高速であることが確認された場合)、ページのサイズをスリム化する作業が必要です-多くのテクニックがありますそれを行うには、しかし、この答えのマージンに収まるには大きすぎます。


1


可能な答えは次のとおりです(個人的な好みの順):

  1. 結果のページ付け

  2. そのような大きなテーブルでjQueryイベントを使用しない(または非常に控えめに)

  3. より良いブラウザを構築します。


1


明らかに、ここではページネーションが最適なソリューションです。 しかし、この種の問題に対処するためにできることがいくつかあります。

  • Webサーバーで圧縮が有効になっているかどうかを確認します。 最も近代的な ブラウザ(IEおよびFF)はモードデフレートヘッダーを送信するため、Webサーバーで圧縮が有効になっている場合は、非常に圧縮された応答が得られます。 私の場合、1Mbの応答は87Kbまで低下しました。

  • まだ実行されていないファイアバグをインストールして、すべての詳細を追跡できます 応答の生成にかかった時間、応答のダウンロードにかかった時間、レンドリングおよびクライアントスクリプトにかかった時間など、スクリプトについて。 同じことが「ネット」タブの下にあります。

  • 私はテストしましたが、DIVベースのテーブルはここでのソリューションではありません。UseDivs ビューなどのレイアウトとテーブルのみ IEのように、Divベースのテーブルレイアウトを使用する場合があります。これは、終了テーブルタグのみが表示されるテーブルの代わりに、受信するとすぐに表示できることです(これは、プログレッシブレンダリングで使用されるFFと比較したデフォルトの動作です)。

  • タイミングを追跡したら、jqueryに問題がある可能性があります クライアント側のリソース。

  • あなたがあまり派手なものを使わずにシンプルなテーブルを表示したいだけなら perl printfは、すでにテーブルの形式にフォーマットされているクライアント(ブラウザ)にデータをプッシュし、PREタグの下に表示します。 私は、9列の4800行とブラウザーが応答し続けるいくつかを表示しています。

  • ここでは、応答が開始されるように500行のバッチでデータをプッシュしています できるだけ早く来て、それはスムーズに思えます。