본문 바로가기

무언가 만들기 위한 지식/C,C++,Embedded C

[Embedded C] 등가교환의 법칙(Trade Off)


언젠가인가 코드최적화라는 책을 한번 읽어보기로 결심한적이 있었고,
최근 그에 대한 책들을 읽어보았다. 다읽고 느낀 점이라면은,
코드최적화를 하기 위해서는 그 방법보다는 개념이 우선시되어야 한다는 느낌이 들었다.
즉 코드최적화 전에 어떤 것이 더 우선시 되어야하는지에 대한 정의등을 말한다.

코드 최적화에는 크게 2가지가 있다.
하나는 크기 최적화와 다른 하나는 속도 최적화이다.
이 두가지 최적화는 서로 등가교환(trade-off) 관계 에 있다.

두산백과사전에서는 Trade-Off를 다음과 같이 정의한다. (시소게임이라고도 한다.)

두 개의 정책목표 가운데 하나를 달성하려고 하면 다른 목표의 달성이 늦어지거나 희생되는 경우의 양자간의 관계.

- 완전고용의 실현과 물가의 안정이라는 두 목표는, 실업율을 저하시키면 물가가 상승하고 물가를 안정시키려 하면 실업이 증가하는 이율배반의 관계를 형성한다. 따라서 두 목표가 양립할 수 없다는 주장이 나오는데, 이 경우 어느 한쪽을 위해 다른 쪽을 희생시키는 것을 트레이드오프라고 한다.



즉, 크기최적화를 시키면 속도가 느려지고, 속도가 빨라지면 소스의 크기가 늘어난다는 것이다.
무조건, 최적화라는 것이 최고의 Output을 보여주는 것은 아니고, 목적과 상황에 맞게 최적화를 선택하여 진행하여야 한다. 
이 두개를 모두 추구하는 것은 불가능한 것이기 때문에
둘중 하나를 주변환경에 고려하여 선택한후 최적화를 하게 된다.

필자도 처음에는 무슨말인가 싶었는데, 책을 읽다보니 조금씩 이해가 가기 시작하였다.

Trade-Off 관계에 있는 것으로는 다음 2가지가 있다.
1. 속도 vs 크기
   - 가장 빠른 프로그램을 위해서는 선형이 되어야 한다. 이는 분기나 점프를 하지 않는 것이며, 함수호출을 사용하지 않는 것을 의미한다. 하지만, 실제로 함수 사용없이 프로그램 개발은 거의 불가능하며, 동일한 코드를 반복하여 사용한다면 코드가 비효율 적이고 메모리낭비로 이어질 것이다.

2. 성능 vs 가독성

   - 성능을 높이기 위해서 코드를 짧게 표현한다면 가독성이 떨어질 수 밖에 없다.

데스크탑같은 x86 환경은 리소스가 풍부하기 때문에 최적화가 중요하지 않을 수 있다.
그래서 빠른 프로세스를 사용하는 비용보다 최적화하기 위한 비용이 더들어갈 수도 있다. 이런 이유로 x86환경에서는 코드최적화를 회의적으로 보기도 한다고 한다. 어설픈 최적화보다는 가독성이 더 중요하기 때문이다.

하지만 임베디드 시장에서는 다양한 제품이 존재하며 제품의 성능, 제품단가등과 고려해서 제한된 기기가 선택되기 때문에 최적화가 민감하다. 각 시스템에서 사용하는 프로세서와 메모리등이 환경에 따라 다르기 때문에 해당 시스템에 적합한 최적화가 필요하게 된다.


필자가 보고 있는 책에서 언급하는
임베디드 소프트웨어의 최적화 규칙은 다음 3가지이다.

- 최선의 알고리즘이나 최적의 코드를 찾아라.
- 시스템(프로세서)를 잘 이해하라.
- 개발 툴을 잘 이해하라.

위 3가지를 기반으로 최적화가 진행 될 수 있다.

최적화에 대한 세부적인 내용에 대해 알고 싶다면 다음책을 참고하면 좋을 것이다.

임베디드 프로그래밍 C코드 최적화
카테고리 컴퓨터/IT
지은이 김유진 (한빛미디어, 2008년)
상세보기