출처 : http://blog.naver.com/chaewh83/140016180847
이걸 내가 쓰는 프로그래밍으로 풀면
1. 컴파일러 최적화 옵션에서 '속도 최적화' 대신 '코드 크기 최적화' 설정이 캐쉬 성능을 향상시켜 좀 더 빠른 코드를 얻게 함.
-> 네트워크 프로그래밍의 경우, 경우에 따라 덜 최적화된 코드가 필요하므로 volatile 를 써야 함.
2. 각 CPU(인텔의 SSE, SSE2 / AMD 3D Now)의 SIMD를 활용하는 함수를 만들것.
-> 서버는 현재로선 인텔 CPU니까.....
3. 가능한 나눗셈 연산을 최소화 할것.
예)
-> b = a / m;
c = d / m;
이 있으면
-> m = 1/m;
b = a * m;
c = d * m;
... 쉬프트가 여러우면 곱셈으로 해버림...
4. switch문을 쓸때 연속된 수치를 사용할것, 그러면 VC가 테이블 형태의 분기를 만들어줌.
-> 즉 가능하면 enum {} 으로 쓰는게 좋다는 이야기임.
예) case 0:
case 1:
case 2: ... (역순으로도 상관없음)
잘못) case 2:
case 4:
case 3:
5. 펜티엄 pro 이상에서는 CMOVxx/FCMOVxx 같은 조건적 이동 명령이 가능.
간단한 if문보다는 ? 를 사용할것.
->A == 0 ? choice1 : choice 2;
다만 디버깅할때 어느쪽 분기로 떨어지는지는 추적하기 힘드므로
#if _DEBUG
if()...
#else
?...
#endif
를 쓰는것도 나쁘지 않을듯.
6. 자주 사용하는 자료 구조는 32bit 배수로 정렬시켜서 사용할것,
컴퓨터의 캐쉬라인을 최적으로 쓸 수 있기때문에 성능이 크게 향상됨. 팬티엄4는 L1캐쉬가 64바이트고 L2가 128바이트
이런걸 감안해서 쓰는 기법을 padding 이라 함.
7. sin, cos, tan, exp, arcsin등 수학 함수는 가급적 쓰지말고,
각 수치 데이터를 테이블로 만들어서 간략한 함수로 만들어 쓸것
-> psp나 3ds때도 이렇게 했는데...
double 의 나눗셈은 39사이클이 걸리지만, float는 19사이클임. (단 2의 제곱수로 나누면 8사이클정도만 걸림)
그리고 float형일때 반드시 뒤에 f를 붙일것.
float a = 1.0; 보다는
float a = 1.0f; 이쪽이 더 빠름
9. 순서에 상관이 없다면 후연산자 보다는 선연산자를 사용할것.
a++; 보다는 ++a; 를 쓸것.
->출처쪽에선 이유가 안나와 있지만, 이걸 어셈 코드상에서 보면
a++; => a = a + 1; 개념이고, ++a; => a+1; 개념임.
10. 가능한 const를 사용할것. 컴파일러가 좀더 최적화를 잘 해줄 가능성이 높아짐.
11. 메모리 관리 함수는 따로 사용하는것이 좋음. malloc 과 free는 느리기 때문에 가능한 메모리풀을 만들어사용할것.
'C/C++언어' 카테고리의 다른 글
간단한 텍스트 뒤집기, 메모리 복사 함수 (0) | 2012.10.19 |
---|---|
[ VC11-C++11 ] range base for - 1 (0) | 2012.09.24 |
CAtlMap 사용법 정리 (0) | 2012.08.25 |
MSXML 파싱 (0) | 2012.07.03 |
프로그램 시간 측정 (0) | 2012.03.21 |