-1

以下の質問は、マイクロソフトのプレースメント テストで出題されました。どちらが優れているかはわかりません。誰か助けてくれませんか?

コード 1:

int MAX=1000;
int a[MAX][MAX];
for(i=0;i<MAX;i++)
    for(j=0;j<MAX;j++)
        a[j][i]=i*j;

コード 2:

int MAX=1000;
int a[MAX][MAX];
for(i=0;i<MAX;i++)
    for(j=0;j<MAX;j++)
        a[i][j]=i*j;

どちらが正しい?

  1. コード 1 の方が速い
  2. コード 2 の方が高速です
  3. どちらもRISCアーキテクチャでは同じです
  4. どちらもほぼ同じ
4

2 に答える 2

3

C/C++ を使用していると仮定すると、コード 2 の方が高速になる可能性があります。C/C++ は、配列を行優先順で格納します。つまり、右端の次元の変動によって、メモリ アドレスの変動が最小になります。そのおかげで、CPU キャッシュはコードのパフォーマンスを向上させることができ、ページ フォールトを心配する必要はありません (コード 2 は単調な順序でメモリ アドレスにアクセスするため、プログラムがデータを含むページの 1 つを読み終わると、もうそのページを見る必要はありません)。

于 2014-11-04T20:59:12.420 に答える
2

違いは、メモリへのアクセス方法にあります。配列は次のように配置されます。

row 0 - 1000 integers
row 1 - 1000 integers
etc.

ここで、最初のループはa[0][0]、次にa[1][0]などにアクセスします。したがって、行 0 を見つけてから、列 0 を見つけて更新します。次に、行 1 を見つけ、その行の列 0 を見つけてアクセスする必要があります。そのため、基本的にランダムにメモリにアクセスすることになります。これは、メモリ アクセスのたびにリロードする必要があるため、CPU キャッシュに悪影響を及ぼします。

2 番目のループはa[0][0]、次にa[0][1]、次にa[0][2]などにアクセスします。したがって、行 0 を見つけてから、列に順番にアクセスします。これはプロセッサ キャッシュに適しています。頻繁にリロードする必要がないため、実行速度が向上します。

于 2014-11-04T20:59:46.127 に答える