2011-11-09 21 views
5

私はFlexTableを使ってGWTプロジェクトに取り組んでいます。私はおそらくCellTableを使用するべきであることを知っていますが、より良いパフォーマンスが得られるはずですが、FlexTableはスタイルが簡単で(特定のスタイルのセル)、特定のセルを簡単に更新できます。GWT FlexTableのパフォーマンスと最適化

WebSocketを使用しているテーブルの更新を受信する。私たちが今直面している問題は、毎秒100を超えるアップデートがWebSocketを経由している場合にCPU負荷が高くなることです。 WebSocket接続の各メッセージには、テーブル内の複数のセルの更新が含まれています。したがって、実際にはFlexTableでレンダリングされるべき毎秒100以上の更新があります。 4GBのRAMを搭載した3GHz i5のCPU負荷は約50%です。データの実際のレンダリングを無効にすると(setText()メソッド呼び出しをコメントアウトすると)、CPU負荷は5〜10%に低下します。だから私は、DOMの更新がボトルネックであり、コードの他の部分ではないことを知っています。

は、それが代わりに

  • CellTableにスイッチ(しかし、どのようにして焦がす細胞の更新を行うために)

    1. 使用グリッド方が良いでしょうか?
    2. DOMの代わりに、FlexTableのsetText(で動作するように使用JS/JSNI)

    は、テーブルを実装し、パフォーマンスを向上させるためにそこより良い方法はありますか?

    誰かがFlexTableで同様の問題を抱えていたとしても、私はそれを試してみましたが、それは単に遅いだけで一般的な意見ではありません。私たちは、JavaScriptで第二のCPU負荷ごとに同じ100のアップデートで純粋に行われたアプリケーションのプロトタイプは15%程度

    更新
    たちは〜10でセルの値に減少CPU負荷の変化を示すために使用されるCSSのフェード効果を削除されてい%。したがって、DOMだけが問題ではないようです。

  • 答えて

    0

    代わりに(または結果に応じて)上記のすべてに、スケジューラメソッドのいくつかを使用します。特にScheduler.get()。scheduleIncremental()を実行し、一度に10個のバッチで更新を行います。これにより、ブラウザは更新の間に他のイベントを処理することができ、CPU使用率に良い影響を与えるはずです。

    個々のセルを更新することができないため、CellTableはここであなたを手伝ってくれません。代替として、グリッドだけを残し、TableElementを手動で管理します。

    +0

    セルの実際の更新はSchedulerImpl.get()。scheduleDeferred()内で実行されますが、それはあまり役に立ちません。それはブラウザをより応答性に保ちますが。 SchedulerImpl.get()を使用すると、取得するデータの量が異なるため、scheduleIncremental()が機能しません。今のところ、Gridを試したり、テーブルを実装したりするべきだと思っています。 – dimchez

    +0

    このケースでは、インクリメンタルは遅延されたものよりはるかに優れています。 Deferredは操作ごとに新しいjsタイマーを使用しますが、インクリメンタルは複数の更新を1つのjs実行スタックにバッチして1ページの再描画を行い、レンダリングスレッドも操作をバッチで行うことができます。 – Ajax

    2

    CellTableを使用すると、単一のセルを更新するためにテーブル全体を再描画する必要があります。しかし、そのような更新は、DOMへの単一の更新である。 FlexTableを使用すると、すべての更新をまとめてバッチ処理しても、一連のDOM操作を個別に行うことになります。したがって、一部のセルを重複して更新するためにCellTableを使用することは効率的ではないように見えるかもしれませんが、スイッチする価値はまだあります。 特に、合計セル数に近いセル数を更新する場合は、バッチ100の更新をまとめて1回のDOM書き込みですべて実行します。

    私は30x100の大きさにすることができるCellTableを持つアプリを持っています。任意のセルには任意のスタイルがあり、各セルには複雑な内容(<img>、一部は<div>、一部のテキスト)があり、時には1つのセルを更新する必要があります。開発モードで私のMacBook Pro上で全体の再描画は気づかれません(私の人間の認識に)。

    ライブアップデート(毎秒100回のアップデートなど)が必要な場合は、別のプラットフォームが必要な場合があります。あなたのモニターは毎秒100回もリフレッシュされません。

    +0

    場合によっては、8列の表に100行あります。 6つの列がWebSocketフィードのデータで更新されます。我々のシミュレーションでは、10msごとに1つのメッセージを生成し、合計で、1秒あたり100メッセージ、600 DOMアップデートを生成します。それはFlexTableが処理するにはあまりにも多くのことです。しかし、データが異なる場所(セル)で更新されるため、データが急速に更新されることに気付くのは簡単です。最小化する1つの方法は、JSNIを使用し、行全体を1つのDOM更新で置き換えることです。しかし、コードがJavaからJavaScriptにコンパイルされた後、GWTが何か他のことをしないかどうかはわかりません。 – dimchez

    +0

    あなたは100hzで一種の輝く効果を望んでいると言っていますが、時々刻々と更新が行われていますか?その場合、私は '

    '構造が不適切だと思います。それはあまりにも更新しています。キャンバス要素、またはFlashについてはどうですか? –

    +1

    あなたが輝きを必要とせず、一度に100行すべてを一度に更新したい場合は、完全に 'CellTable'を使うべきです。 –

    0

    大きなテーブルではより速いcellTable.redrawRow(index);を使用できます。
    良いことは、行インデックスがFieldUpdaterで与えられていることです。

    関連する問題