단순히 비교(뺄셈) 보다 XOR이 빠른것은 누구나 알 수 있다.
하지만 루프문에서도 그럴까?
int test[256];
1. for(int i = 0; i < 256; ++i) test[i] = 0;
과
2. for(int i = 0; i ^ 256; ++i) test[i] = 0;
을 예로들어보자.
전자(1)가 컴파일 되면 다음 비슷한 코드가 된다. (더 최적화 될 수도 있음)
lea edi, test
xor eax, eax
mov ecx, 256
rep stosd
후자(2)가 컴파일 되면 다음 비슷한 코드가 된다.
lea edi, test
xor eax, eax
xor ecx, ecx
loop1 :
mov [edi], eax
add edi, 4
inc ecx
mov edx, ecx
xor edx, 256 // xor 시 레지스터가 파괴되기 때문에 ecx 만으로 카운팅 + xor 을 할 수 없다. cmp 계열은 비교에 사용된 레지스터를 건드리지 않음
jnz loop1
이렇게 되면 결과는 전자 압승.
오오
맞네요. if 문은 ^ 가 더 좋을 순 있는데 for 문일 땐 신중해야 겠네~
근데 stosd 가지고 오는 건 반칙 아닌가유~ ㅋㅋㅋ
하기사 Code Optimizer도 고려해서 짜야 하니깐.
사실 stosd 랑 edi 직접 운영한거랑 속도차이 안나 ㅋㅋ
걍 군살 좀 많으면 prefetch 쨈 빨라지는거?
(그만큼 메모리가 느리다는거지~)