2012-01-19 13 views
-2

どちらの機能が効率的ですか?どの機能がより効率的ですか?

int rows=20000; 
int col=30000; 

void func1() { 
    for(i=0;i<rows;i++) { 
     for(j=0;j<col;j++) 
      print(a[i][j]); 
    } 
} 

void func2() { 
    for(j=0;j<col;j++) { 
     for(i=0;i<rows;i++) 
      print(a[i][j]); 
    } 
} 
+2

何の面でも効率的ですか? – cdeszaq

+0

また、どの言語でですか? – cdeszaq

+1

時間の点では – CommonMan

答えて

4

アクセスされているデータがメモリ内で順番に(または大部分は順番に)配置されているため、パフォーマンスはおそらく最初の関数のほうがよいでしょう。これは、1つのメモリ位置で読み取りを実行すると、隣接するメモリ位置がキャッシュに持ち込まれるため、読み取り時にキャッシュ内にない場合よりもはるかに高速に読み取られるため、高速です。 _ このようなことについて誰もが本当に知っておくべき理由は、パフォーマンスの差が絶対的に劇的なものになる可能性があるからです。約5年前、私は第2の機能のようなコードを持つプロジェクトのパフォーマンスを最適化するために取り組んでいました。私はシーケンシャルメモリにアクセスしてC言語でプログラミングするとき、まるでそのようなループの速度を10倍に増やすことができました。

+0

メモリに格納されている配列の順序(バイト順序)はすべてのシステムで必ずしも同じではありません... – cdeszaq

+0

@cdeszaq:これはバイトオーダーとは関係ありません。これは、配列の行メジャーまたは列メジャーの順序と関係があります。 – parasietje

1

これ以上のことはわからず、配列の実装方法によって異なります。

配列が行優先順に格納されている場合は、func1がより高速で、column-firstの場合はfunc2が高速です。

しかし、私が言ったように、いい答えを与えるのに十分な情報はここにありません。

関連する問題