1

MATLAB を使用して、実稼働環境での製品フローのシミュレーション用のシミュレーション エンジンを作成しました。使用されているすべてのクラスをハンドルから継承し、これらのハンドルを使用して (かなり過剰だと思います)、たとえば製品と作業システム、注文などをリンクしました。

ここで、モデルの複数のインスタンスを実行するために、他のすべてのオブジェクトとそれらの関係を含むシミュレーション オブジェクトを作成し、モデルを実行してシミュレーション変数を解放します。

モデルの作成と実行には約 50 秒かかります (これには、すべてのオブジェクトの生成、それらの関係、そしてもちろんシミュレーション実行中の計算が含まれます)。次の実行の前に変数を解放するには、現在 3 ~ 4 分かかります。

パフォーマンスに大きな違いを通知することなく、古いシミュレーションオブジェクトのクリア、削除、および単純な上書きを試みました。

コードを書き直さずにパフォーマンスを改善する方法はありますか?

4

2 に答える 2

1

コード、または少なくとも高レベルの設計を見ずに、コードについて特定のことを言うのは困難です。

OO の側面を最適化する前の短いアドバイス: ボトルネックがオブジェクトの作成にあると確信していますか? プロファイラーで確認します。

OO が実際にボトルネックである場合は、次のように推測できます。

  1. 循環参照を使用しました。Matlab はガベージ コレクターを使用しませんが、スマートな参照カウント メカニズムを使用しているため、この場合は非常に遅くなる可能性があります。代わりに、オブジェクト間の参照をツリー状に変更してください。

  2. 膨大な量のオブジェクトを作成しました。Matlab には、従来の言語 (c++、java) よりもはるかに多くの、各オブジェクトのかなりのオーバーヘッドがあります。システムを再設計して、オブジェクトの数を減らします。

于 2012-09-11T08:35:07.017 に答える
0

セル配列を使用して、ハンドル オブジェクト内から他のハンドル オブジェクトを格納していませんか? これにより、Matlab R2011A より前のバージョンでは深刻な速度低下が発生する可能性があります。http://www.mathworks.com/support/solutions/en/data/1-6VVMS0/index.html?product=MLを参照してください。

回避策として、temp ローカル変数を使用して cell 配列を操作し、この tmp 変数をハンドル オブジェクト プロパティに再度割り当てます。あるケースでこれを行った後、パフォーマンスが最大 100 倍向上しました。

于 2012-10-25T18:42:30.030 に答える