8

主に画像の表示とその他の簡単な操作 (ポイントの選択や画像からのデータのプロットなど) のために、いくつかの MATLAB GUI ( GUIDE を使用しない) をプログラミングしています。

GUI が起動すると、すべての操作がすばやく実行されます。ただし、GUI を使用すると (3D/4D ボリュームとは異なるフレームを表示し、上記の操作を実行する)、次第に遅くなり始め、通常の使用には遅すぎるポイントに到達します。

以下に関する意見をお聞きしたいと思います。

  • GUI が遅くなった理由を見つけるために考えられる戦略。
  • これを回避するための適切な MATLAB GUI プログラミング プラクティス。
  • これらの問題に対処する可能性のある参照。

set/getappdata を使用して、GUI のメイン フィギュアに変数を保存し、関数間で通信しています。

(最小限の実用的な例を提供できればと思いますが、これはやや複雑な GUI でのみ発生するため、この場合には適していないと思います。)

どうもありがとう。

編集: (プロファイラーを使用して調査結果を報告:)

私は次の 2 つの場面でプロファイラーを使用しました。

  • GUI を起動した直後。
  • しばらくいじってから、遅くなり始めるまで。

両方のプロファイリング操作でまったく同じ手順を実行しました.GUI上でマウスを動かすだけです(両方とも同じ「パス」)。

プロファイラーの結果は次のとおりです。

ここに画像の説明を入力

これらの結果を解釈するのに苦労しています... 特定の関数 ( などimpixelinfo) の呼び出し数が 2 番目のケースで非常に多いのはなぜですか?

ご意見はありますか?

どうもありがとう。

4

2 に答える 2

2

この問題を回避するために私が見つけた唯一の最良の方法は、上で示唆されたものでした: 強制的なガベージ コレクションです。このコマンドforceGarbageCollectionは MATLAB では認識されませんが、すばらしいアドバイスです。あなたが望むコマンドはjava.lang.System.gc()...そのような獣です。

私は、40Hz で 2 つのシリアル ポート (タイマーを使用) と 1000Hz で 1 つの NIDAQ (を使用startBackground()) を読み取り、それらすべてをリアルタイムでグラフ化するプロジェクトに取り組んでいました。MATLAB の並列処理の制限により、これらのプロセスの 1 つが常にバッファ チョークを引き起こすことが保証されていました。アニメーションが追いつかず、最終的にフリーズするなどの問題が発生しました。単一のプロットを定義し、setコマンドを使用してアニメーション ループ内で変更されたパラメーターのみを更新していることを確認することで、最初の成功を収めることができました。(ex.figure, subplot(311), axis([...]),hold on, p1 = plot(x1,y1,'erasemode','xor',...);など -->tic, while (toc<8) set(p1,'xdata',x1,'ydata',y1)...

を使用setすると、アニメーションがより速く、より滑らかになります。ただし、特にリアルタイムのデータ入力など、バックグラウンドで多くのことが行われている状態でアニメーションを長時間実行すると、バッファ ウォールにぶつかります。ガベージ コレクションがその答えです。瞬間的ではないため、ループが非常に長い場合を除き、すべてのループ サイクルを実行する必要はありません。私の解決策は、while ループの外側にカウンター変数を設定し、mod 関数を使用して、「n」サイクルごとにのみ実行されるようにすることです (例counter = 0; while ()... counter++; if (~mod(counter,n)) java.lang.System.gc();.

これにより、あなた (そしてできれば他の人) の時間と頭痛の種を大幅に節約できます。MATLAB は、LabVIEW と同等のリアルタイム データ収集とアニメーションを実行できます。

于 2015-01-18T02:37:25.677 に答える
1

Matlab で何かが遅い理由を見つけるための良い戦略は、プロファイラーを使用することです。プロファイラーを使用する基本的な方法は次のとおりです。

profile on
% do stuff now that you want to measure
profile off
profile viewer

新しく開いた GUI と、しばらく開いていて著しく遅い GUI のプロファイルを作成することをお勧めします。次に、結果を比較し、「Self Time」または「Total Time」が大幅に増加している関数を探して、スローダウンの原因を突き止めます。

于 2013-05-15T15:08:12.693 に答える