5

次のコード スニペット、実行効率の観点から、single の 3 次元配列のトラバーサルを考えてみましょprocess1()process2()

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 コンパイラが、このようなループを検出して最適化し、おそらくネストを並べ替えているか、または、特に何が起こるかという点で、潜在的なパフォーマンス ヒットを常に警戒する必要があるかどうかです。ループを並列化しようとしたら?

4

1 に答える 1

3

これは、C または C++ コンパイラで期待される種類の最適化です。これは実際には最新のものであり、この正確な最適化については、Build 2013 セッションのこのビデオで言及されています。C/C++ プログラマーを対象としていますが、ここで取り上げられている内容の多くは C# プログラマーにとっても興味深いものです。メモリ サブシステムの制約も同様に関連しています。最適化がVS2013に組み込まれたかどうかは実際にはわかりません.iircには、ネイティブコンパイラの速度が低下しすぎるという問題がありました.

しかし、いいえ、ジッター オプティマイザーは非常に厳しい予算で機能します。あまりにも多くの時間を費やすと、顕著な起動の遅延と実行の一時停止が発生するため、この種の分析を行う余裕がありません。C# プログラマーは、これを自分で行う必要があります。

于 2013-07-17T19:33:12.343 に答える