2012-03-28 8 views
6

私はMatlabで書かれた大きなシミュレーションスイートを持っていますが、他の内部プロジェクト(実行速度も良い)とのインターフェースが良くなることから、.NETへのいくつかの機能を移して、 Matlabの中から。 .NETオブジェクトの呼び出しに伴うオーバーヘッドはから以内Matlab?ここで.NETのパフォーマンスがMatlab

は編集程度.NET

話をしていない良いdiscussion on Matlab OOです:簡単な調査

私は別のオブジェクト内の単純なアクセスや割り当て操作のMatlabの中から自分で簡単なテストを実行しました正式なMatlabオブジェクト(R2011b)、Javaおよび.NETを1,000,000回呼び出します。メソッド呼び出しは内部ループを参照し、プロパティ/フィールド呼び出しはMatlabからパブリックフィールドにアクセスし、Matlabをループすることを指します。 .NETのオーバーヘッドがJavaよりはるかに高いが、実際の実行時間は約半分であるため、最後の結果は私を困惑させる。何が起こっている?

 
    Access(s) Assign(s) Type of object/call 
    --- MATLAB --- 
    0.003361 0.004268 'myObj.field' 
    0.003403 0.004263 'myStruct.field' 
    0.003376 0.003392 'myVar' 
    0.152629 0.303579 'myHandleObj.field' 
    25.79159 -   'TestConstant.const' 
    0.003384 -   'myTestConstant.const' (instance) 
    0.006794 0.008689 'TestObj.methods' 
    0.157509 0.303357 'TestHandleObj.methods' 

    --- NON-MATLAB --- 
    10.70006 16.42527 'JavaObj fields' 
    0.005063 0.005441 'JavaObj methods' 
    43.49988 43.96159 'NetObj fields' 
    0.002194 0.002306 'NetObj methods' 
+3

は、単独の引数で、Matlabの、I'LL内から.NETオブジェクトを呼び出してどのくらいのオーバーヘッドが関連付けられています私のシステム上で私のアプリケーションのためにそれを測定しなければなりません。あなたは今、オーバーヘッドの測定を開始するかもしれません。 –

+0

私は実際に私が共有することができます簡単な調査を行いましたが、私は100未満の担当者を持っているので、私はまだ自分の質問に答えることはできません。 xPを –

+0

は、私はあなたのデータを見ることを楽しみにして、あなたはそれを含めるようにあなたの質問を編集することはできませんか? –

答えて

0

実行中のアプリケーションは、GD I/GD I +ツールを使用してデータを再計算し再描画するためのリソースを消費します。両方の操作は互いにリンクされていません。再計算とは、並べ替え、フィルタリング、グループ化、および再描画以外のすべての操作を意味します。

2

Matlabの.NETメソッドで作業する場合、かなりのオーバーヘッドがあります。

私はMatlabの(8.0.0.783(R2012b))での小規模なテストをした:

v = zeros(10000,1); 
for i=1:3 
    rnd = System.Random(); 
    tic; for j=1:10000, v(j) = rnd.NextDouble(); end; toc; 

    dt = System.DateTime(2014,1,28,0,0,0); 
    tic; for j=1:10000, dt = dt.AddSeconds(1); end; toc; 
end 

私のPCアプリでMATLABにとります。最初のループの場合は0.5秒、2番目のループの場合は1秒です。 0.00015秒と0.0002秒かかる純粋な.NETコードです。そのため、Matlabで.NETオブジェクトメソッドを呼び出すときのオーバーヘッドは、.NETオブジェクトと手続きに依存します。

さらに複雑な.NETオブジェクトメソッドの場合、オーバーヘッドはさらに悪化する可能性があります。私は、特殊な科学データ形式のファイルにアクセスするための.NET APIを担当しています。

この.NET APIはMatlab内で使用できます。さらに悪い場合は、.NETのreadメソッドを呼び出すたびにdouble値またはfloat値を1つだけ読み込みます(時系列ファイル:多数の項目に対して1つの値(倍精度または浮動小数点数)があるたびに)。

このようなファイルを読むためのスクリプトは、私のラップトップのMatlabが、.NETへの呼び出しを1.000回以下で行うことができることを示しています。

Matlab関数(基本的にread_file()関数をスクリプトの最初の行に置きます)に同じコードを入れると、Matlabは毎秒約6.500の.NET呼び出しを行います。したがって関数内では、Matlabは.NETメソッドを呼び出すときに、スクリプト内よりも約8倍高速です。上記のテスト例では再現できません。

結論として、Matlab内から.NETメソッドを呼び出すにはかなりのオーバーヘッドがあります。 "chatty"の代わりに.NET APIを "chunky"にすることが重要です。

私たちは、すべての読み込みを行い、大きな行列でデータを収集し、Matlabへの1回の呼び出しで行列を返す、ユーティリティの.NET dllに一連の "chunky helper"メソッドを作成して問題を解決しましたMatlab.NET境界を越えた活動を最小限に抑えます。

NETコードは、Matlab内から実行されるときと同じように、純粋な.NETアプリケーション内から実行されたときと同じ速さであるようです。あなたはうーん、決定する方法はありません」を考えておくことでしょうこれに取得するすべての答えの終わりに

関連する問題