![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
x ^= y ^= x ^= y; 에 대해..
위식을 맨뒤부터 하나씩 풀어보면? 1식. x = x^y ; 2식. y = y^(1식) = y^(x^y) = y^x^y ; // 여기서 y=x 가 되죠. 왜냐면 XOR두번하면 윈래값으로 되니까 3식. x = 1식 ^ 2식 = (x^y)^ (y^x^y) =( x^y)^x = y ; 결국 x와 y값은 swap되죠.. 참고 http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=477 머리가 나쁘니 몸으로라도 뛰어야겠죠 ㅎㅎ
실제로 두가지 알고리즘을 가지고 속도를 비교해 보았습니다. 폼에 메모와 버튼만 배치하시고 아래 소스를 돌리면 됩니다. #include "mmsystem.h" #define SWAP(a,b) {(a)^=(b)^=(a)^=(b);} #define SWAP2(a,b) {int swaptemp=(a);(a)=(b);(b)=swaptemp;} void __fastcall TForm1::Button1Click(TObject *Sender) { int startTime[2]; int endTime[2]; int swapA=1, swapB=2; unsigned int loop; unsigned int maxLoop=400000000; startTime[0] = timeGetTime(); for( loop=0 ; loop<maxLoop ; loop++ ) SWAP(swapA,swapB); endTime[0] = timeGetTime(); startTime[1] = timeGetTime(); for( loop=0 ; loop<maxLoop ; loop++ ) SWAP2(swapA,swapB); endTime[1] = timeGetTime(); Memo1->Lines->Add( "XOR SWAP 결과" ); Memo1->Lines->Add( endTime[0]-startTime[0] ); Memo1->Lines->Add( "STACK SWAP 결과" ); Memo1->Lines->Add( endTime[1]-startTime[1] ); } 결과는??? 음.. 릴리즈 모드에선 별 차이 없는데 디버그 모드에선 압승이군요;;; 음.. 예전에 KLDP에서 이 내용으로 논란이 있었던 것으로 기억합니다만.... ^^;;;;
이러한 주제를 가지고 너무 깊게 생각하실 필요는 없다고 봅니다. 예전에도 한참 시끄러웠었지만 결국 이말 한마디에 모두 KO였습니다. 정작 중요한 로직이나 알고리즘은 X판으로 짜면서 이런거나 for(;;)냐 while(1)이냐 같은 시스템 전체 성능으로 보면 영향이 아예 없다시피한 것에만 광신적으로 매달린다 였는데요. 고해상도 카운터를 이용한 테스트 입니다. 아제나님이 테스트 하신 스왑1, 2의 디버그, 릴리즈 테스트 결과입니다. Swap1이 x ^= y ^= x ^= y Swap2가 int temp 를 이용한 방식으로 각각 만번씩 루프롤 돌렸습니다. (릴리즈) ----------------- [Swap1] time is = 0.00001369 sec [Swap2] time is = 0.00000950 sec [Swap2] time is = 0.00000950 sec [Swap1] time is = 0.00001369 sec [Swap1] time is = 0.00001369 sec [Swap2] time is = 0.00000950 sec [Swap2] time is = 0.00000978 sec [Swap1] time is = 0.00001369 sec (디버그)------------------------- [Swap1] time is = 0.00008716 sec [Swap2] time is = 0.00004274 sec [Swap2] time is = 0.00004274 sec [Swap1] time is = 0.00008716 sec [Swap1] time is = 0.00009638 sec [Swap2] time is = 0.00004218 sec [Swap2] time is = 0.00004218 sec [Swap1] time is = 0.00008716 sec 어떠신가요? 굉장히 고효율을 보일듯 하지만 최고와 최저 성능의 차이는 10만분의 4초 차이입니다. 속도로는 오히려 x ^= y ^= x ^= y 이 방식이 효율이 나쁩니다. 나는 10만분의 4초를 느낄수 있고, 신경쓰여! 라는 분이 계신다면 모를까.;; 이건 역시 재미일 뿐 의미가 없다고 봅니다...;; 뭐.. 장치제어에서 한정된 자원으로 4바이트를 아끼기위해(물론 속도는 포기하면서) 이걸 사용한다면 모를까.. 과연 이러한 방식이 필요한곳이 어디일까요..ㅡㅡ???
제 생각입니다만.. 이걸 안다고 해서 대단한 사람도 아니고 모른다고 해서 안대단한(?) 사람이 되는 것도 아니라고 생각합니다. 이건 뭐 마치 일본 방송에서본 밥짓기 명인이 하는 소리랑 똑같습니다. 밥지을때 물을 먼저 넣고 그다음에 쌀을 넣어야 맛이 있지, 쌀을 넣고 물을 넣어 씻으면 맛이 없다고 하는데.. 다들 거기서 "오오오~~ 대단하다. 그런 비밀이~!!"라고 탄성들을 외치는데..ㅡㅡ; 그명인 잡아다가 저 2가지 경우 밥지어놓고 구분하는지 못하는지 시켜보고 싶더군요. ㅡㅡ; 강신영.Divinespear님//
KLDP에서 대략 한 3~4년 전쯤 논란이 됬던글을 다시 보게되서 허걱? 했습니다.. ;; 그리고 쓴김에 한말씀 더 드리자면.. 물론 다른 분들에게 동기부여가 되고, "아.. 해보니 별차이 없구나"라는걸 직접 해보게 만드는 의도도 좋습니다만.. --------------------------------------------------------------------------- 그럼 c를 사용하지 않고 a와 b를 서로 바꿀 때 어떠한 제약이 있을까? 메모리는 실제로 얼마나 절약될까? c를 사용할 때와 그렇지 않을 때의 CPU 클럭 싸이클의 차이는 어떨까? 만약 레지스터에서 직접 조작한다면 어떻게 될까? (이 경우 a와 b는 보통 EAX와 EDX가 될 것이다. c는 아마 EBX일 것이고..) 레지스터를 직접 조작할 때 위에서 제기된 제약을 피해갈 수 있을까? 피할 수 있다면 그걸 피하는게 쉬울까? 아니면 어려울까? CPU 클럭 싸이클은 c를 사용할 때와 그렇지 않을 때 어디에 더 유리할까? --------------------------------------------------------------------------- 이러한 내용을 장황하게 써 놓으시려면 시간이 안나셔도 직접 해 테스트와 분석을 해보신 후에 문제제기를 하시는 편이 더 좋지 않을까 싶습니다. 글을 보면 "당신들이 알지 못하던 대단한 사실이 숨겨져 있다"라고 보입니다만..; 실제로 해보니 한번당 십억분의 4초가 오히려 더 "느리다"면 굉장히 실망들 하시지 않을까요? 게다가 글만 읽고서 리플을 보시지 않은 분들이 막연히 "아~ 이런 멋진 방법이~"라고 계속 생각하고 계실지도 모릅니다.. ;; 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |
- -?