2009년 2월 17일 화요일

코드 최적화와 관련한 문제

 

문제 1 : a가 3이면 "a == 3"을 출력하고, a가 3이 아니면 "a != 3"을 출력하라.

방법 1: 줄수를 줄이기
방법 2: printf()함수 호출 줄이기

일반적( 50점 ) :

if( a == 3 ) printf( "a == 3" );
else printf( "a != 3" );

줄 수 줄이기( 75점 ) :

( ( a == 3 ) ? printf( "a == 3" ) : printf( "a != 3" ) ); /* 3항 연산자 사용 */

함수 호출 줄이기( 100점 ) :

printf( ( ( a == 3 ) ? "a == 3" : "a != 3" ) ); /* printf()함수를 한 번만 사용 */

문제 2 : a가 짝수이면, "a는 짝수"을 출력하고, a가 홀수이면, "a는 홀수"를 출력하라. ( 단 printf함수는 한 번만 호출하며 되도록 3항연산자와 %s는 쓰지 말 것. if문 맘껏 쓰십시오. )

점수:

3항 연산자 사용 50점

%s 이용 75점

3항 연산자와 %s안 쓰면 100점

짝수 비교 최적화 +10점

 

나머지 이용(100점)

char *dd[] = { "짝", "홀" };
printf(dd[a%2], a);

최적화 이용(110점)

char *dd[] = {"짝","홀"};
printf(dd[a&1], a);

 

최적화 했을때 어셈 코드 수 비교

a%2로 했을때
        movl    %edx, %eax
        sarl    $31, %eax
        shrl    $31, %eax
        leal    (%eax,%edx), %eax
        sarl    %eax
        addl    %eax, %eax
        subl    %eax, %edx
        movl    %edx, %eax


a&1로 바꿨을때는
        andl    $1, %eax

참고로 최적화 이용 코드는 퀘이크 제작자가 풀었다고 하는데… 존카멕인가? 게임 엔진 제작에 천재로 불리는 사람, 그가 만든게 언리얼 엔진이고… 정말 gee(ㅎㄷㄷ) 하다. ^^

하여간 별나라 사람의 이야기고 나에겐 %, &의 쓰임새를 새롭게 보게 됬다.

댓글 없음: