> 백엔드 개발 > C++ > 8192 요소 배열을 반복하면 갑자기 프로그램 속도가 느려지는 이유는 무엇입니까?

8192 요소 배열을 반복하면 갑자기 프로그램 속도가 느려지는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-17 04:47:25
원래의
259명이 탐색했습니다.

Why Does Looping Over an 8192-Element Array Suddenly Slow Down My Program?

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 값에 따른 성능 변동성 회:

  • SIZE = 8191: 3.44초
  • SIZE = 8192: 7.20초
  • SIZE = 8193: 3.18 secs

문제 이해

실행 시간의 차이는 수퍼 정렬이라는 알려진 문제로 인해 발생할 수 있습니다.

  • SIZE가 2048의 배수인 경우(예: 8192), 특정 패턴의 요소에 액세스하면 메모리 레이아웃 효율성이 떨어집니다.

메모리 관리

Malloc/free는 성능 차이.

외부 루프 순서

이 코드의 또 다른 주요 문제는 외부 루프의 순서입니다. 원래 코드는 행렬을 열 단위로 반복하는 반면 행 단위 반복은 메모리 액세스에 더 효율적입니다.

해결책

성능 문제를 완화하기 위해 외부 루프는 교체해야 합니다:

    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;
        }
    }
로그인 후 복사

성능 개선

외부 루프를 교체한 후 성능이 크게 향상됩니다.

  • SIZE = 8191: 0.376초
  • SIZE = 8192: 0.357초
  • 크기 = 8193: 0.351초

위 내용은 8192 요소 배열을 반복하면 갑자기 프로그램 속도가 느려지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿