2013-09-03 5 views
6

私は簡単なC++コードを書いてC++でテストしましたが、mex file_name.cppでMATLABに同じコードを適用し、C++と同じコンパイラを使用しているMATLABで同じコードを実行します。ここでは、コードは次のようになります、私はMATLABのために、このコードを編集したこのコードのMatlabとC++の速度比較

double a;int j;int i; 
double* k; 

for(j = 0; j < 100;j++){ 
    for(i = 0; i < 10000000; i++){ 
     a = a+1; 
    } 
    a = a/10000000; 
} 

plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); 
k = mxGetPr(plhs[0]); 
*k = (double)a; 

すなわち、適切なタイプに変更MEX-機能などを追加し、結果がで約900ms以下のとおりです。ここで

int k; 
for(int j = 0; j < 100;j++){ 
    for(int i = 0; i < 10000000; i++){ 
     k++; 
    } 
    k/=10000000 
} 

は、MATLABのコードがありますC++で3100 msとは対照的にMATLABです。

は、私が理解していないこと、しかし、MATLABは周り3.5倍高速である両者が同じコードを実行していて、同じコンパイラで(MATLABで私は、コマンドラインでmex -setupを書いて、MEXコンパイラとしてVisual Studioのコンパイラを選択)であります

これより高速で、C++では何をしていないのですか?誰かが私に理由を説明してください、なぜそれほど大きな違いがありますか?私は他のコードを試しましたが、MATLABでは3〜6倍高速です。

私のPCは64ビットWindows 7、Visual Studio 2010はC++、MATLABはR2012bです。

これは私のVisual Studioバージョンのためですか?私はそれをVS2012に変更すれば、それは速くなるでしょうか?

mex -v出力はこちらです。

+0

コンパイラは依然として####で、同じ値を返す単純なforループは削除できません。私の飛行機はどこにありますか? :-) – xanatos

+0

mex -vを使ってmexをコンパイルし、matlabがどのフラグを使用しているかを確認してください。 – Shai

+6

あなたはVSでデバッグモードまたはリリースモードでコンパイルしていますか? – Shai

答えて

3

パフォーマンスは、MATLABは、このケースではやっているどのようなプラットフォーム、OS、コンパイラなどに大きく依存している

おかげで、それは何らかの形でVS2010のコンパイラはなかった最適化を見つけることに成功しました。私はVS2012へのアップグレードは大きな違いはないと思うが、間違っているかもしれないと思う。結局のところ、それは別のコンパイラです。

これは幾分驚くべきことですが、コンパイルフラグをチェックし、さまざまな設定でプロファイリングを試してみてください。 Matlabのインストールが32ビットであれば、違いが生じる可能性があります。

ご自分のコードに若干の違いがあるかもしれませんが、気付かなかったほどわずかです。あなたのコードは、パフォーマンスのばらつきも大きい他のライブラリとリンクしている可能性があります。

ここでの教訓は、を正確ににピン止めするのは非常に難しいということです。

EDIT:デバッグ用にコードがコンパイルされていると述べました。デバッグオプションを有効にすると他の最適化が無効になる可能性があり、各コンパイラはどのようなデバッグ情報が重要で、コードに固執するかという考え方が異なるため、コンパイラが出力するバリエーションがさらに増えます。

すべてのデバッグオプションをオフにして、より一貫した出力を得ることをお勧めします。同様のレベルの最適化でコンパイルしていることを確認することをお勧めします。おそらく最大限の可能性があります。

MATLABコードで、あなたが double aを使用しているときに、内側のループで int kを使用するC++コードでは
+0

私は最適化を変更しましたが、それらのうちのいくつかは "コマンドラインエラーD8016: '/ ZI'と '/ Ob1'コマンドラインオプションは互換性がありません。 – smttsp

+0

ええ、それはリリース/デバッグモードのためです。私がデバッグを変更すると、それは '920ミリ秒'になります。これはmatlabの実行時間とほぼ同じです。 – smttsp

+0

シンプルなコードの場合、2つのコンパイラが同じ性能の出力を生成するのは妥当だと思います。他のパラメータによる変動。 – patrickvacek

3

、(およびa=a+1からa++表記から奇妙な、変...)

あなたはunininialized両方それらを残します;this questionなぜそれが悪いのかを見てください。

MEXファイルは、デフォルトでANSI Cにあります。あなたのコードは実際にはそうです。 mex -setupを再確認してください。誤ってCコンパイラを選択したと思って、誤ってCコンパイラを選択した可能性があります。

また、両方のコンパイルのコンパイラオプションがまったく同じであることを確認してください。 正確にはと同じです。

しかし、私は問題の核心は、あなたがMATLABバージョンのC++バージョンとダブル演算で整数算術演算を行っているということだと思います。これは大きな違いをもたらす可能性があります。

これ以外にも、既に説明した内容と違いはありません。実際、基本的な最適化さえあれば、まったくまともなコンパイラであれば、このループがほんの些細なものであることを検出し、それを完全に削除できるはずです。

+0

'mex -setup'とは関係ありません。 C++とmatlabをリリースモードに変更した後では、わずかに違いがありますが、これは3.5倍の遅さに比べて受け入れられます。 – smttsp

+0

@smttsp:「受け入れ可能」とは何ですか?違いは一切ありません。 –

+0

これは、マシンや他のプログラムの状態などに起因する可能性があるため、matlabよりも1〜10%遅くても問題ありませんが、3.5倍遅くなることはまったく受け入れられません。 – smttsp

関連する問題