CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): swhan (Nameless 1)
날 짜 (Date): 2003년 4월 15일 화요일 오후 01시 05분 25초
제 목(Title): Re: [Q]8개의 값을 가장 빠르게 비교하는 �


딴에는 심각하게 고민해본겁니다. ㅋㅋ 그리고 2기가가 아니고 4GB인데요.. 뭐
메모리 read에서 delay만 없다면 제일 빠른 방법 아니겠습니까? 또 요즘
웍스테이션들은 캐쉬가 1~2MB는 되니까 16bit int 4개로 쪼개서 각각 매핑한거
|로 논리연산하는게 제일 빠를지도...  (A가 주어지면 A에 대해 나올 수 있는
모든 B의 가능성을 mapping table로 만들어 둔다는 얘깁니다.) 연산은
#define compare_A_64(B) (table[B}) 
이거로 끝나겠죠.
16bit 4개라면
#define compare_A_16_1(BB) (table_1[BB])
#define compare_A_16_2(BB) (table_2[BB])
#define compare_A_16_3(BB) (table_3[BB])
#define compare_A_16_4(BB) (table_4[BB])

B는 short형태의 4개 array로 받아들여서 

return compare_A_16_1(B_1) | compare_A_16_1(B_2) | compare_A_16.....
이렇게면 끝날텐데요.

lookup 4번에 or 3번입니다.
2차cache에서 64KB x 4개 공간만 확보할 수 있으면 loop보다는 빠르지 싶군요.
(시스템마다 다르겠지만)

근데 제 개인 취향으로는  Sue님꺼가 제일 맘에 들고 그담은 valken님과 
prince님의 솔루션을 조합한 모양이 담으로 맘에 드네요.
(Sue님같은 솔루션을 얻어보려고 잔머리를 굴렸었는데 제 머리론 
실패했었습니다. T.T )

Sue님꺼 조금 수정하면 
#define compare8array(A,B) ( ((unsigned long long)(A) \
- (unsigned long long)(B))  \
     & 0x8080808080808080L )
정도일까요? 
흠..포터빌러티는 좀 떨어지지죠? 

그리고 확률적인 면에서 valken님과 Sue님꺼의 조합이 좀 더 빨라보이는데..
int compare8array( char *a, char *b)  

if( a[0] < b[0] ) return 1;
if( a[1] ...
if( a[2]... 
....

return 0;
}

or를 명시하는 것 보다는 이게 조금 빠를 것 같은데 어떻게 생각하시나요?
B가 큰 지점에 대한 확률적인 정보가 있다면 그걸 우선 비교하면 조금 더 
빠르겠죠.

@ 처음 질문한 게스트분은 그냥 루프 돌리신다니까 우리끼리 계속 놀아보죠. 
  다른 형태의 솔루션 찾으신 분 계신가요?

@ 참.. 그리고 chilly님 말씀이 잘 이해가 안가는데 보충설명좀 해주실 수 
있으신가요?  제가 원체 수학적 배경지식이 없어놔서...

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.