1

C# と VisualStudio を使用して WindowsForm を開発しています。プログラムはMatlabで実行された.exeを起動し、この.exeが終了した後、いくつかの.matファイルに大量のデータを生成し、このデータをチャートにプロットする必要があります(すべて同時にではありません)。ユーザーは、この「信号」の 1 つを選択し、それを描画する必要があります。

構成に応じて、各信号は ~10.000 から ~500.000 の値を持つことができ、この量のデータで信号をプロットすると、チャート コントロールがスムーズに応答せず、ズームイン/ズームアウトにも時間がかかります。より多くの信号を同時に描画すると、制御はさらに不安定になります。

一方、Matlab 自体からの信号をプロットすると、作業はほぼ即座に完了します。ズームは完全に機能し、パフォーマンスが維持されるため、必要な数の信号を描画できます。

Matlab と C# のパフォーマンスに大きな違いがあるのはなぜですか?

C# のパフォーマンスを改善するにはどうすればよいですか?

編集: VisualStudio で提供される標準のチャート コントロールを使用しています。

4

2 に答える 2

0

使用しているチャート コントロールについては言及されていませんが、大規模なデータ セット用に設計されていないものであることは間違いありません。プロットには OpenGL に基づくものを使用してください。

私の経験では、C#+OpenGL 実装のフレーム レートが 10 倍高いのに対し、3,000 万を超えるデータ ポイントを使用する Matlab のパン アンド ズームのパフォーマンスが低いことに実際にかなり悩まされています。

(他の理由の中でも、MatLab はデータセットの画面外にある部分を完全に選別できていないようです。たとえば、単調に増加する時間軸がある場合、これは非常に簡単な最適化であり、大きなメリットがあります)

于 2013-04-22T14:54:15.357 に答える
0

それを表すピクセルよりも多くのデータがあります。チャート コントロールが力ずくのアプローチを取っているようです。コントロールのピクセルの列ごとに 1000 個のデータ ポイントがある場合でも、すべてのデータ ポイントを描画します。

チャート コントロールのソース コードにアクセスできるかどうかに関係なく、ソリューションは同じになります。つまり、描画呼び出しの数を減らす必要があります。データをフィルタリングして、より管理しやすいサイズにする必要があります。折れ線グラフの場合、コントロールの幅が 500 ピクセルであれば、500 を超える線を描画しようとするべきではありません。

チャート コントロールのコードにアクセスできる場合は、内部でデータ セットを減らすことができます。それ以外の場合は、データ セットの抽象ビューを外部で管理し、完全なデータ セットの代わりにビューをチャート コントロールに渡す必要があります。ユーザーがズーム レベルなどを変更すると、ビューを更新する必要があります。残念ながら、基になるチャート コントロールがデータ セットを表示対象に自動的にクリップすることを認識しているかどうかによっては、パンを実装するのが少し面倒な場合があります。ユーザーがビューをパンするたびに自分でクリッピングを実行する必要がありますが、スクロールバーの一貫性を保つために、各軸の端にデータ ポイントも含める必要があります。

最初に元のデータ セットが X 軸の値で並べ替えられていることを確認して、作業を簡単にします。並べ替えは 1 回だけ行う必要があり、その後は任意のズーム レベルで比較的迅速にビューを作成できます。AO(log N) 検索は、可視範囲の開始点と終了点のインデックスを識別できます。そこから、ビューの X サンプルを抽出するのは簡単です。元のデータが X 軸上で一定の間隔で取得されることがわかっている場合は、O(log N) 検索も必要ありません。視覚範囲のインデックスを直接計算できます。

于 2013-04-22T15:55:46.987 に答える