본문 바로가기
개념공부/임베디드 C 프로그래밍 최적화

임베디드 C 프로그래밍 속도 최적화 - 반복문 최적화 1

by Zach Choi 2024. 7. 15.
728x90
반응형

1. 루프 풀기

 아래 2가지 형태의 for 문을 비교해보자. 아래 코드는 크기가 100인 배열에 값을 저장하는 코드이다. 첫번째 for 반복문은 일반적인 반복문이고 두번째 반복문은 루프 풀기를 적용한 것이다.

 

 두 코드 모두 크기가 100인 배열에 값을 저장하지만, 첫번째 코드는 비교 연산 101회, 반복을 위한 계산은 100회를 계산한다. 두번째 코드의 경우 비교 연산은 26회, 반복을 위한 계산은 25회 수행된다. 따라서 루프를 돌리는데 발생하는 비용이 1/4로 줄어들게 된다.

 

 하지만, 그렇다고 루프를 완전히 푸는 것이 최고의 최적화는 아니다. 그만큼 코드 블록이커져 메모리가 커지기 때문이다. 따라서 속도와 메모리 사이에서 적절한 선택이 필요하다.

 


2. 루프 병합

 병합 가능한 인접 반복문은 하나로 합치는것이 빠르다. for 반복문은 비교와 카운트 연산이 추가될 뿐만 아니라, 매 반복마다 분기가 발생하여 파이프 라인이 파괴되기 때문이다. 따라서 for 반복문을 병합하는 것이 속도를 빠르게 할 수 있다.

 

 아래 예시의 첫번째 코드는 2개의 for 문을 사용했고 두번째 코드는 이를 병합한 것이다. 두번째 코드와 같이 반복문을 병합하면 for 문의 비교, 카운트 연산, 분기를 줄일 수 있어 속도가 더 빠르다.

 

 테스트 해보면 PC 환경에서는 속도 차이가 거의 없고, 임베디드와 같이 컴퓨팅이 충분하지 않을 때 차이가 발생한다.

 


반응형
728x90

3. 반복문과 상관없는 계산은 밖으로 빼자.

   반복문과 상관없는 계산은 반복문 바깥에서 수행하는 것이 효율적이다. 아래 첫번째 코드는 반복문 내에서 Rect 구조체 내부 멤버에 접근한다. 이때 Rectangle.E.a 멤버까지의 접근은 모든 반복문에서 동일하지만, 매 반복마다 수행된다.

 

 두번째 코드는 Rectangle.E.a 멤버까지의 접근을 반복문 바깥으로 뺀 것이다. 그리고 매 반복문 마다 달라지는 a 멤버의 접근만 반복문 내에서 수행한다. 반복문마다 동일한 멤버 접근을 반복문 바깥에서 수행함으로서 불필요한 연산을 줄여 속도를 높일 수 있다.

 

 

 아래 코드도 비슷한 예이다. 첫번째 코드는 subfunction의 인자를 포인터 p로 값을 읽어온다. 하지만 포인터 p로 접근한 값은 반복문 내에서 변하지 않는다. 따라서 두번째 코드와 같이 포인터 p로 접근한 값을 변수에 저장한 수 함수에 사용하면 불필요한 연산을 줄일 수 있다.

 

 

 

참조 : 임베디드C프로그래밍최적화, 김유진 저, 한빛미디어

 

임베디드 C 최적화 - 반복문 2 (tistory.com)

 

임베디드 C 최적화 - 반복문 최적화 2

1. 루프 변수에 네이티브 데이터 타입을 사용하자. 네이티브 데이터 타입을 사용하면 데이터 버스와 메모리의 접근성이 좋아져 빠르게 동작할 수 있다. (네이티브 데이터 타입이란 프로세서의

iridescentboy.tistory.com

 

728x90
반응형