- PR -

イベントが頻発するようなWindowsアプリケーションの挙動について

投稿者投稿内容
Lichtenstein
ベテラン
会議室デビュー日: 2003/11/06
投稿数: 61
投稿日時: 2005-08-19 14:29
>既存の通信ライブラリを使用しておりますので、通信部分の実装は
>よく分かりません。ライブラリに用意されているイベントハンドラ
>のデリゲート先を実装しているだけになります。

なるほど。

>ちなみにこの実装ではDataGrid+カスタムDatasetでデータを画面に
>表示させていますが、これらのコントロールを操作する部分の実装を
>コメントアウトすると、前述の現象は発生しなくなります。

データ量がわかりませんが、これ、何か更新がある度に全てのデータを
更新して、全てのグリッドを更新して、再描画して……という感じなんでしょうか?

データを更新する処理の時間と、描画の頻度をチューニング出来ると、
パフォーマンスの改善に繋がりそうです。

たとえば、最後に描画した時刻を記憶しておいて、5秒以上経過しないうちは
再描画しないとか。

きくちゃんさんの、フラグを立てておくやり方は、
相当追い風を受ける開発になるので覚悟の上でどうぞ。
やらにゃいかん場合もあるでしょうが・・・・・・
JK
会議室デビュー日: 2005/08/11
投稿数: 10
投稿日時: 2005-08-19 14:51
引用:

Lichtensteinさんの書き込み (2005-08-19 14:29) より:

データ量がわかりませんが、これ、何か更新がある度に全てのデータを
更新して、全てのグリッドを更新して、再描画して……という感じなんでしょうか?

データを更新する処理の時間と、描画の頻度をチューニング出来ると、
パフォーマンスの改善に繋がりそうです。


1000row、5〜6columnです。更新データは1イベント毎に
1rowずつサーバから飛んでくるので、このrowのインデックス
を取得し、同じインデックスを持つDatasetのRowのデータと
差し替えています。基本的にはこれの繰り返しです。

サーバとのデータの送受信の方式は今回の要件では変更する
ことができません。

引用:


きくちゃんさんの、フラグを立てておくやり方は、
相当追い風を受ける開発になるので覚悟の上でどうぞ。
やらにゃいかん場合もあるでしょうが・・・・・・


おそらく.NET標準で満足なパフォーマンスが得られなければ

 ・より軽量なグリッド製品を探す。
 ・より軽量なグリッドを自作する。
 ・.NETを採用しない(デルファイなどを検討)

になると思います...
JK
会議室デビュー日: 2005/08/11
投稿数: 10
投稿日時: 2005-08-19 14:52
(二重投稿の為削除します)

[ メッセージ編集済み 編集者: JK 編集日時 2005-08-22 13:52 ]
Lichtenstein
ベテラン
会議室デビュー日: 2003/11/06
投稿数: 61
投稿日時: 2005-08-19 15:17
>1000row、5〜6columnです。更新データは1イベント毎に
>1rowずつサーバから飛んでくるので、このrowのインデックス
>を取得し、同じインデックスを持つDatasetのRowのデータと
>差し替えています。基本的にはこれの繰り返しです。

データの更新と通信量については、十分に短いですね。
(凄いcolumnなら別ですけど)

やはりDataGridのパフォーマンスに問題がありそうです。
DataGridはWeb向けのクラスなので、JKさんのような使われ方が
想定されていないのかもしれません。

別コントロールを探したほうが良さそうですね……
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2005-08-19 18:22
引用:

Lichtensteinさんの書き込み (2005-08-19 15:17) より:
データの更新と通信量については、十分に短いですね。
(凄いcolumnなら別ですけど)

やはりDataGridのパフォーマンスに問題がありそうです。
DataGridはWeb向けのクラスなので、JKさんのような使われ方が
想定されていないのかもしれません。

別コントロールを探したほうが良さそうですね……


南部です。

すみません、ちょっとわからないので質問させて下さい。

「更新データは1イベント毎に1rowずつサーバから飛んでくる」
このイベントの頻度が具体的ではないと思いますが、なぜ、DataGridの
パフォーマンスに問題があるという結論なのでしょうか?

また、「DataGridはWeb向けのクラスなので」はどういった意味でしょうか?
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-08-19 18:57
ども、ぼのぼのです。

引用:

nanbuさんの書き込み (2005-08-19 18:22) より:
また、「DataGridはWeb向けのクラスなので」はどういった意味でしょうか?


私もこれに関してはよくわからなかったので聞いてみたいですが…

閑話休題。あくまで参考レベル、ということで聞いてください。ちょっと前に人づてに聞いた話で、具体的な実装は(開発言語すら)知らないんですけど、あるところにとても重いアプリケーションがあったそうです。それは図形編集系のアプリで、マウスで操作が発生するたびに、画面全体を再描画していたもんで、非常に重かったそうです。
で、使い物にならないんで、操作によって影響を受けた範囲だけピンポイントで再描画するように修正したところ、性能は劇的に改善されたそうです。

これが応用できれば解決の糸口になりそうですが、ざっくり調べた限り、DataGridに特定の行だけピンポイントで再描画させるような機能はなさそうですねぇ…

Web版DataGridのページングみたいなインターフェースにできれば、再描画の負荷は分散させられそうですけど、使う側の気持ちを考えると、スクロールはあってもいっぺんに全部見たいですよねぇ (^^;
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-08-19 20:24
引用:

JKさんの書き込み (2005-08-19 14:21) より:
きくちゃんさん

引用:

以下、適当な事を言いますが、イベントハンドラでは実際の処理をせずに、
「イベントが発生したよ」というフラグを立てといて、別のタイミングで定期的に
そのフラグを見に行って処理を行うとか。


要件としてリアルタイムにデータの更新を視覚化する、というのがあります
のでこの方式は採用できないです。こちらの説明が足りませんでしたm(_ _)m




データが送信されたら、とりあえずどこかに保持しておいて、定期的にタイマーで再表示させちゃだめなのでしょうか。

データ点数にもよりますが、1秒間に大量にデータがやってくるなら、その都度、再描画するのではなく、1秒ごとに再描画しても、人間の目にはそれほど違和感は感じられないように思います。

無駄な再描画も防げそうですし。リアルタイムな性質もそれほど損ねてはいないと思うのですが。
JK
会議室デビュー日: 2005/08/11
投稿数: 10
投稿日時: 2005-08-19 20:38
引用:


かずくんさんの書き込み (2005-08-19 20:24) より:
データが送信されたら、とりあえずどこかに保持しておいて、定期的にタイマーで再表示させちゃだめなのでしょうか。

データ点数にもよりますが、1秒間に大量にデータがやってくるなら、その都度、再描画するのではなく、1秒ごとに再描画しても、人間の目にはそれほど違和感は感じられないように思います。

無駄な再描画も防げそうですし。リアルタイムな性質もそれほど損ねてはいないと思うのですが。


確かにおっしゃる通りです。

ただし今回の作業はちょっと特殊と言いますか、既存のアプリケーションを.NETで
置き換えてみて、望みのパフォーマンスが得られるか否かを確認するのが
大事な要件の1つになっています。.NETを使用した場合に既存のWindowsネイティブな
アプリと比べてパフォーマンスが落ちることは予想しており、それがどの程度アプリの
動作に影響が出るのかを把握したいと考えています(マシンスペックの向上で相殺
されうるのか、など)。

ちなみに上記の「既存のアプリ」というのは、パフォーマンスを出すためにコントロールを
カスタマイズしているそうです。ですので予めかなりの高パフォーマンスがクライアントに
求められているシステムだと言えると思います。

[ メッセージ編集済み 編集者: JK 編集日時 2005-08-19 20:40 ]

スキルアップ/キャリアアップ(JOB@IT)