코드 최적화 관련 질문입니다.
도도한
Technique Note 게시판에 있는 최적화 관련 게시물과 비슷한 내용이 있는 페이지 입니다.
http://myohan.egloos.com/3029296(링크 수정했습니다. 트랙백 링크가 잘못되어있었네요.)
여기에 있는 것들중 질문이 있는데,
7. 2의 배수로 나누기
나누기를 할 때 2의 배수를 분자로 함으로써, 코드를 더 효율적으로 만들 수 있다. 이경우에 컴파일러는 나누기 연산대신에 shift 연산을 할 수 있기 때문이다. shift 연산은 가장빠른 연산중의 하나다. 그러므로 가능하면 2의 배수로 나눌 수 있도록 스케일을 조절할 필요가 있다. (예를 들어 66으로 나누어야 한다면 64로 나눌 수 있도록 스케일을 조절하라).
typedef unsigned int uint; uint div32u (uint a) {
return a / 32;
}
위의 예제는 2의 배수가 아니라 2의 n제곱수로 나누라는 말이겠죠?
그리고 나와있는 예제 코드는 우리가 굳이 쉬프트 연산으로 리턴하지 않아도 (return a5; 처럼)
컴파일러가 쉬프트 연산을 쓰는 기계어를 생성한다는 말이죠?
9. 나머지 연산자의 대체
우리는 나눗셈의 나머지를 알기 위해서 나머지 연산자 %를 사용한다. 이경우 % 연산대신 판단문을 사용해서 시간을 줄일 수 있다. 아래의 두 코드를 비교해 보기 바란다.
uint modulo_func1 (uint count)
{
return (++count % 60);
} uint modulo_func2 (uint count)
{
if (++count = 60)
count = 0;
return (count);
}
if 문은 나머지 연산자보다 빠른코드를 생성한다. 주의 할점은 2번째 함수의 경우 0에서 60사이의 값에 대해서만 제대로 측정이 된다는 점이다.
나머지 연산자가 단항연산자로도 쓰이나요?
저 코드를 어떻게 해석해야 할까요?
Commented by 정태영 at 2007/09/24 15:26 # x
대부분은 컴파일러에서 최적화를 해주는 것들이네요. :)그리고 마지막으로 코멘트에 대한 질문입니다.정태영씨가 남기신 말이 사실인가요? 컴파일러가 최적화를 해주는 부분이라면 우리가 굳이 신경 쓸 필요가 없는것들 아닌가요?총 3가지 질문 이었습니다. 질문은 밑줄로 표시했습니다.
-
글길
1. 예
2. % 연산자는 이항연산자입니다.
modulo_func2()함수는 count + 1의 값이 60보다 작으면 count + 1을 리턴하고 (이때는 (count + 1) % 60과 결과가 같음)
아닌 경우에는 0을 리턴하는데, 60 이상인 경우에는 올바른 연산이 되지 않습니다.
3. 원문이 길어서 읽어보지는 않았지만, 실제로 성능이 좋은 컴파일러는 최적화를 매우 잘합니다.