2009년 6월 22일 월요일

Duff's device

C사용자가 데이터 복사를 구현하는데에 있어 속도를 최적화한 기법

 

오리지널 버젼

 

do {

*to  = *from++; // to는 single memory-mapped output register

} while (--count > 0);

 

와 같은 소스를

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);
}

다음과 같은 방법으로 사용

소스를 switch,do~while를 이용하여 조건문 실행을 최소화하여 접근속도를 빠르게 하여서 실행속도의 최적화를 얻게 된다.

 

최초 duff's device가 나왔을때는 switch문을 count를 위해 사용하는 괴악한 방법때문에 이게 과연 표준 C 문법이 맞느냐는 논란이 일었으나 결국 어떤 컴파일러에서도 지원하는걸 확인하고.. 여튼 별 문제없이 쓸수 있다는 결론이 나옴

C를 어셈블리처럼 쓴 기법임.

 

Stroustrup's version

 

mystrcpy나 mystrrev 등을 구현하고자 할때 속도에서 이득을 얻고자 한다면

to를 single memory-mapped output register로서 생각하지말고 *to++ = *from++; 등으로 사용하면 된다.

근데... strcpy나 배열일반복사 생각하고 그렇게 쓸거면 차라리 그냥 memcpy쓰는게 나음...........

원래 라이브러리 함수 그냥 쓰는게 속도면에서는 당연히 무적일 허슬

 

stroustrup 버젼으로 구현해서 속도에서 최대한으로 이득을 얻을수 있는건 strrev처럼 이레귤러적인 복사방법에 한정되겠습니다.

 

애초에 copy에 한정된 기법이라 더 이상의 활용용도를 모르겠는데 더프 디바이스의 활용용도에 대해서 잘 아시는 분들 예시 좀 알려주셨으면 합니다!


추가 : http://ideathinking.com/cpptips/y2k2/duffs_device.html 더프 디바이스에 대한 활용 예시 + 실험

 

댓글 없음:

댓글 쓰기