Tuesday, October 14, 2008

Code Tuning

코드 튜닝은 기본적으로 구조에 적합한 효율성을 얻는데서 만족해야지 지나친 최적화나 그 반대의 경우로 치우치면 곤란하다.
  1. Hotspot (병목) 찾아내기
  2. 그 부분 최적화 하기
의 식으로 진행하는데, 코드 튜닝의 팁&예를 들면 아래와 같다.

나눗셈은 다른 연산보다 비용이 많이 든다. 그래서 가능한 경우 아래처럼 할 수 있다고 한다.


k = (a+b) % n; // 요거 대신
k = a + b; if (k>=n) k -=n; // 요렇게

경우에 따라 2배의 성능 차이가 있다고 한다.

메모리 접근 빈도나 계산 시간 중 오래 걸리는 것을 개선해라

매크로가 항상 성능을 개선시키는 것은 아니다. recursive하게 호출되는 경우 책에서는 경우에 따라 1,000배까지 느려진다고 한다. 이건,.. 테스트 해봐야 겠다. (물론 매크로를 써서 성능이 향상된 경우도 있다.)

for loop 의 비교횟수를 줄여 5% 성능향상을 가져올 수도 있다. 좀, 심하긴 한데,


int search(int t) {
hold = x[n];
x[n] = t;
for (i = 0; ;i++) {
if (x[i] == t)
break;
x[n] = hold;
if (i == n)
return -1;
else
return i;
}
요렇게 해서 for 루프에서 매번하던 비교연산을 줄일 수 있다.

그리고, loop unrolling으로 속도를 개선할 수 있다. loop를 말그대로 조금 펼쳐서 pipeline이나 Multicore 에서 돌아가는 점을 살려 병렬로 실행시킬 수 있다. (요건 컴파일러에서도 어느정도 지원해줄 것 같다.)

위에서 소개된 방법들의 이름으로 정리를 해보면,

  • Exploit common cases 자주쓰이는 경우를 캐시하는 것과 비슷한 방법이고,
  • Exploit an algebric identity 요건 대수적인 최적화를 한다는 것이고,
  • Collapsing procedure hierarchy 는 함수콜 대신 매크로, 인라인 쓰는 것이고
  • Loop unrolling 은 아까 했고.
  • Data structure augmentation 은,. 설명하기 귀찮다. ㅡ.ㅡ;.

No comments:

Post a Comment