투덜이 블로그
by 투덜이
카테고리
이전블로그
Duff's Device
저처럼 처음 보는 분도 있겠지만 원래 C 사용자들에게는 유명한 문제이기도 하더군요. 오늘 여기저기를 돌아다니다가 발견했습니다. C 언어의 약점이라고 알려져 있는 switch 문안에서의 break 문제를 이렇게도 이용하다니 신기하네요. 이게 왜 빠른지 이해하는 데 약간의 시간이 걸렸습니다. ^^

Duff's Device와 관련된 메일 링크


====

Evans & Sutherland Picture System의 programmable IO data register로 short 데이터 배열을 복사하는 다음 루틴을 보죠.


send(to, from, count)
register short *to, *from;
register count;
{
do
*to = *from++;
while(--count>0);
}


(물론 count가 0이면 이 루틴은 실패하지요)

VAX C 컴파일러는 이 루프를 두개의 인스트럭션으로 컴파일합니다. (movw와 sobleq라고 생각됩니다만) 해보면 알 수 있듯이, 이 루프는 실시간 에니메이션 재생 프로그램의 가장 큰 병목이 됩니다. 50% 정도 느리게 되지요. 이런 경우 속도를 높이는 전통적인 방법은 sobleq를 줄여 루프를 조금 돌게 만드는 것이지요. 그렇게 하면, 남은 바이트들을 처리하는 문제가 남게 됩니다.

저는 C를 쓸 때는 이것을 원래 루프문 안에 인덱스를 달아놓은 switch를 사용해 처리합니다. 물론 어셈블 언어로 코드를 짤 수 있다면, 바로 남은 바이트들을 처리하도록 루프 중간으로 점프하도록 했겠지요. 어제 이걸 고민하다가 다음과 같은 코드를 만들었습니다.


send(to, from, count)
register short *to, *from;
register count;
{
register n=(count+7)/8;
switch(count%8){
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while(--n>0);
}
}


역겹다고요? 하지만 컴파일도 되고 잘 돌아가기만 하는 걸요. 나는 이걸 발견한 것이 자랑스럽기도하고 동시에 증오스럽기도 합니다. 아무도 이걸 먼저 생각해 내지 않았다면 내 이름을 붙이려고 합니다.

(이하 생략)
====


by 투덜이 | 2005/07/04 19:45 | 프로그램 | 트랙백
< 이전페이지 다음페이지 >


이글루링크
최근 등록된 덧글
●달통위젯을 사용해 보..
by 보름달 at 10/11
"세상 속 꿈 찾기...*"란..
by Stefan at 07/06
尹氏曰, "君子求在我者..
by 투덜이 at 04/03
愚按, 此章問答, 其淺..
by 투덜이 at 03/22
往者, 其所已言者. 來者..
by 투덜이 at 03/22
詩衛風淇澳之篇, 言治..
by 투덜이 at 03/22
諂, 卑屈也. 驕, 矜肆也..
by 투덜이 at 03/22
尹氏曰, "君子之學, ..
by 투덜이 at 03/21
不求安飽者, 志有在而..
by 투덜이 at 03/21
信, 約信也. 義者, 事..
by 투덜이 at 03/20
최근 등록된 트랙백
코드 소유권(Code Own..
by Younghoe.Info
[펌] 이름을 어떻게 ..
by Smalltalk로 하는 객체지..
피플웨어
by 투덜이 블로그
프로그래머. 어떻게 살..
by 써니의 一生牛步行
Windows Vista Beta 1..
by 아크몬드의 비스타블로그
팟캐스팅(Podcastin..
by Podcasting! 팟캐스..
메모장
rss

skin by 이글루스