본문 바로가기

Programing/메모리 관리

코드 최적화에 대한 Tip

출처 :  http://blog.naver.com/neojzs.do


1. 컴파일러의 최적화 옵션에서 '속도 최적화'대신에 '코드 크기 최소화' 설정이 캐쉬 성능을 향상시켜 좀 더 빠른 코드를 얻을 수 있게 한다.

2. 각 CPU(인텔의 SSE, SSE2 / AMD의 3DNow )의 SIMD 를 활용하는 함수를 만들어 사용해라

3. 가능한 나눗셈 연산을 최소화해라.
예)
<수정전>
b = a / m;  
c = d / m;

<수정후>
m = 1 / m;
b = a * m;
c = d * m;

4. switch문을 쓸 때 연속된 수치를 사용해라. 그러면 VC가 컴파일할 때 테이블형태로 만들어 조건분기보다 빠르게 사용된다.
예)
case 0 :  
case 1 :
case 2 :

예2)
case 10 :
case 9 :
case 8 :

잘못된 예)
case 2 :
case 4 :
case 3 :

5. 펜티움 Pro이상에서는 CMOVxx / FCMOVxx 같은 조건적 이동 명령을 이용할 수 있다. 간단한 내용은 IF문보다 다음과 같은 코드를 사용해라.

A == 0 ? choice1 : choice2;

6. 자주 사용하는 자료 구조는 32바이트의 배수로 정렬시켜 사용해라. 컴퓨터의 캐쉬라인을 최적으로 사용할 수 있기 때문에 전체 성능이 크게 좋아진다. 펜티움 4는 L1의 캐시라인크기가 64바이트이고 L2가 128바이트, AMD 애슬론은 L1, L2가 64바이트이다. 이 기법을 패딩(Padding)이라고 한다.

7. sin, cos, tan, exp, arcsin등의 수학 함수는 가급적 피하고 룩업 테이블이나 비슷한 형태로 간략하게 함수로 만들어서 사용해라.

8. 부동 소수점은 가급적 double보다 float를 사용해라. double의 나눗셈은 39사이클이 걸리지만 float은 19사이클만 걸린다. (단, 2의 제곱수로 나누면 8사이클정도만 걸린다) 그리고 float형 일때는 반드시 뒤에 f를 붙여라. float a = 1.0; 보다 float a = 1.0f; 가 더 빠르다.

9. 순서에 상관이 없다면 후연산자 보다 선연산자를 사용해라. a++; 보다 ++a;를 사용하라는 것이다.

10. 가능하다면 const를 사용해라. 컴파일러가 좀더 최적화가 잘 해줄 가능성이 생기게 된다.

11. 메모리 관리 함수는 따로 만들어서 사용하는 것이 좋다. malloc과 free는 느리기 때문에 시작할 때 메모리를 많이 잡은 뒤 관리해서 사용하는 것이 좋다. 퀘이크1 이 좋은 예이다