지시어를 활용한 루프 효율 최적화
이 단계에서는 다양한 지시어와 전략을 사용하여 C 프로그래밍에서 루프 효율성을 최적화하는 기술을 배우게 됩니다. 루프 성능과 가독성을 향상시키는 다양한 접근 방식을 살펴봅니다.
최적화 기술을 보여주기 위해 ~/project 디렉토리에 loop_optimization.c라는 파일을 만들어 보겠습니다.
cd ~/project
touch loop_optimization.c
#include <stdio.h>
#include <time.h>
#define ARRAY_SIZE 10000
// Function to calculate sum using traditional loop
int traditional_sum(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
// Function to calculate sum using optimized loop
int optimized_sum(int arr[], int size) {
int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
// Loop unrolling technique
int i;
for (i = 0; i + 4 < size; i += 4) {
sum1 += arr[i];
sum2 += arr[i + 1];
sum3 += arr[i + 2];
sum4 += arr[i + 3];
}
// Handle remaining elements
for (; i < size; i++) {
sum1 += arr[i];
}
return sum1 + sum2 + sum3 + sum4;
}
int main() {
int arr[ARRAY_SIZE];
clock_t start, end;
double cpu_time_used;
// Initialize array
for (int i = 0; i < ARRAY_SIZE; i++) {
arr[i] = i + 1;
}
// Traditional sum
start = clock();
int traditional_result = traditional_sum(arr, ARRAY_SIZE);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Traditional Sum: %d\n", traditional_result);
printf("Traditional Loop Time: %f seconds\n", cpu_time_used);
// Optimized sum
start = clock();
int optimized_result = optimized_sum(arr, ARRAY_SIZE);
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Optimized Sum: %d\n", optimized_result);
printf("Optimized Loop Time: %f seconds\n", cpu_time_used);
return 0;
}
다음은 여러 최적화 기술을 보여주는 또 다른 예시입니다.
#include <stdio.h>
#define MAX_SIZE 1000
int main() {
int numbers[MAX_SIZE];
int even_sum = 0, odd_sum = 0;
// Efficient initialization and summation
for (int i = 0; i < MAX_SIZE; i++) {
numbers[i] = i + 1;
// Conditional sum with minimal branching
even_sum += (numbers[i] % 2 == 0) * numbers[i];
odd_sum += (numbers[i] % 2 != 0) * numbers[i];
}
printf("Sum of Even Numbers: %d\n", even_sum);
printf("Sum of Odd Numbers: %d\n", odd_sum);
return 0;
}
시연된 주요 최적화 기술:
- 루프 언롤링 (Loop unrolling) 을 통한 루프 오버헤드 감소
- 분기 예측 최소화
- 초기화 및 처리 결합
- 조건부 합산을 위한 곱셈 사용
최적화 플래그를 사용하여 프로그램을 컴파일하고 실행합니다.
## Compile with basic optimization
gcc -O2 loop_optimization.c -o loop_optimization
./loop_optimization
## Compile with advanced optimization
gcc -O3 loop_optimization.c -o loop_optimization
./loop_optimization
추가 최적화 팁:
-O2 또는 -O3 컴파일러 플래그 사용
- 루프 내 함수 호출 최소화
- 적절한 데이터 유형 사용
- 불필요한 계산 방지
- 루프 불변 코드 이동 (Loop invariant code motion) 고려