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는 성능 차이.
외부 루프 순서
이 코드의 또 다른 주요 문제는 외부 루프의 순서입니다. 원래 코드는 행렬을 열 단위로 반복하는 반면 행 단위 반복은 메모리 액세스에 더 효율적입니다.
해결책
성능 문제를 완화하기 위해 외부 루프는 교체해야 합니다:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!