2013-07-17 15 views
5

process1()process2()を実行するために時間の同じ長さを取ると仮定し、実行効率の点で次のコード、シングルの三次元配列のトラバースを考える:.NETコンパイラ - ネストされたループ最適化は組み込まれていますか?

float arr[mMax,nMax,oMax]; 

for (m = 0; m < mMax; m++) 
    for (n = 0; n < nMax; n++) 
    for (o = 0; o < oMax; o++) 
     { process1(arr[m,n,o]); } 

for (o = 0; o < oMax; o++) 
    for (n = 0; n < nMax; n++) 
    for (m = 0; m < mMax; m++) 
     { process2(arr[m,n,o]); } 

を今、それがことが知らのC#行の主要な構造として.NETフレームワークの配列を整理します。最適化がなければ、最初のループは2番目のループよりもはるかに高速に実行されると仮定します。

質問:CLRのJITまたはcs.exe/vb.exeコンパイラは、このようなループを検出して最適化しますか、おそらくネストの順序を変更しますか?私はループを並列化しようとするとどうなるでしょうか?

+2

一般的には、コンパイラの最適化を望むべきではありません – oakio

答えて

3

がCまたはC++コンパイラで期待する最適化の種類です。これは実際には最新のものですが、この正確な最適化はBuild 2013セッションのthis videoに記載されています。 C/C++プログラマーを対象としていますが、カバーされていることはC#プログラマーにとっても面白いことです。メモリサブシステムの制約も同様に関連します。実際に最適化がVS2013になったのかどうかは分かりませんが、iircにはネイティブコンパイラの処理速度が遅すぎるという問題もありました。

しかし、いいえ、ジッタオプティマイザは非常に狭い予算で動作します。あまりにも多くの時間を費やすと、スタートアップの遅延や実行の中断が顕著になり、このような分析をする余裕がありません。 C#プログラマーはこれを自分で行う必要があります。

+0

ビデオは魅力的です。それにリンクしてくれてありがとう。私は、C#コンパイラ開発グループがC/C++開発グループと密接に統合されておらず、これらの最適化がパイプライン上にあることを保証しているという印象を持っています。あなたはそれに同意しますか? –

関連する問題