私は最近、次のようにあるコメントに出会っ:多次元配列のこれらの2つの実装の間にこのような実行時間の差があるのはなぜですか?
多次元配列は、配列アクセスのために多くの時間がかかります。キャッシュとアクセス速度を向上させるには、インデックスを小から大に、つまり
rmq[1002][1002][11][11]
ではなくrmq[11][11][1002][1002]
のような配列をrmq
と宣言することをお勧めします。
私は同じことをテストするコードを試しました。コード1:
int pre_compute[18][100001]; //global variable
int main(){
/*some precomputations on pre_compute array
of the order of size of the array*/
/*Run 10^8 queries on pre_compute array,
O(1) per query.*/
}
コード2:
int pre_compute[100001][18]; //global variable
int main(){
/*exact same precomputations on pre_compute array as done in Code 1
of the order of size of the array*/
/*Run 10^8 queries on pre_compute array,
O(1) per query.*/
}
両方のコード配列の分布を除いて同一です。それでも、2つのコード間に大きな実行時間差がありました。最初のコードは私のPCで平均で0.40 secs
でしたが、他のコードは平均で1.42 secs
でした。
配列の2つの実装の間にこのような大きな実行時間差が生じる理由は何でしょうか?
これが役に立ちます:http://stackoverflow.com/questions/16699247/what-is-cache-friendly-code、http://stackoverflow.com/questions/9936132/why-does-the-orderループの影響を受けるパフォーマンス - 2d-arterを反復する場合 – vu1p3n0x
@ vu1p3n0xこれらのうちの後者は問題となり、不都合に省略されたコードで何が起こっているのか実際に宣言された配列を使用します。良くやった。 – WhozCraig
次回に[MCVE]を提供するか、質問の重複した回答に同意しない場合はここに投稿してください。 –