실수형에서 정수형 형변환 성능 높이기

일반적으로 실수형에서 정수형으로 형변환을 하는 경우가 종종 있다. 이때 보통 묵시적으로 컴파일러가 알아서 해 줄수 있지만 이렇게 할 경우에 속도가 상당히 느리다. 한두번은 빠르게 느껴져도 이게 백만번, 천만번일 경우 형변환 부분에서 전체 함수의 90%까지 잡아먹을 수도 있다. 이럴경우 아래의 코드를 이용하여 성능을 30% 정도 끌어올릴 수 있다.

 

이때, 주의할 점은 아래의 함수를 이용한 경우 실수형은 반올림을 행한다는 것이다. 이 점을 주의하자~

 

우선 아래의 매크로를 선언한다.

#ifdef __BIGENDIAN__ 
#   define FTOI_LONG reserved, l 
#else 
#   define FTOI_LONG l 
#endif
#define USE_FTOI union{ double r; struct { long FTOI_LONG; } l; } __ftoitmp;
#define OP_FTOI(val) (((__ftoitmp.r=(val)+((((65536.*65536.*16.)+(65536.*.5))*65536.)) ), __ftoitmp.l.l-0x80000000L))

 

위의 매크로를 선언하고 나서, 형변환을 하려는 함수의 처음에 아래의 코드를 집어넣는다.

register USE_FTOI

 

그리고 실제 형변환은 아래와 같이 한다. 아래 코드의 경우 반올림을 버리기 위해서 일부러 0.5를 빼고있는것을 볼 수 있다.

i_orgc = OP_FTOI(r_orgc - .5f);

Related Posts

답글 남기기

이메일 주소는 공개되지 않습니다.