8192 要素をループするとプログラムが遅くなる理由
次のコード スニペットを考えてみましょう。
#define SIZE 8192 float img[SIZE][SIZE]; // input image float res[SIZE][SIZE]; // result of mean filter int main() { // Initialization for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { img[j][i] = (2 * j + i) % 8196; } } // Matrix processing - applying mean filter for (int i = 1; i < SIZE - 1; i++) { for (int j = 1; j < SIZE - 1; j++) { res[j][i] = 0; for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { res[j][i] += img[j + l][i + k]; } } res[j][i] /= 9; } } }
このコードは次のことを示しています。実行時の SIZE の値に応じたパフォーマンスの変動回:
理解問題
実行時間の違いは、スーパーアライメントとして知られる既知の問題に起因する可能性があります:
メモリ管理
Malloc/free はパフォーマンスの違いに直接関与しません。
アウター ループ順序
このコードのもう 1 つの重要な問題は、外側のコードの順序です。ループします。元のコードは行列を列方向に反復しますが、行方向の反復はメモリ アクセスの効率が高くなります。
解決策
パフォーマンスの問題を軽減するには、外側のループを使用します。置き換える必要があります:
for (int j = 1; j < SIZE - 1; j++) { for (int i = 1; i < SIZE - 1; i++) { res[j][i] = 0; for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { res[j][i] += img[j + l][i + k]; } } res[j][i] /= 9; } }
パフォーマンス改善
外側のループを交換した後、パフォーマンスが大幅に向上しました:
以上が8192 要素の配列をループするとプログラムが突然遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。