필자의 컴파일러에서 말한 것 때문에 보다 xorq %rax,%rax
이 더 빠릅니다. 그러나 대답을 모르는 경우 xorq과 movq 공연을 비교하려면 어떻게해야합니까?ASM 명령어 속도를 어떻게 비교합니까?
은 내가 시도하는 것은 이것이다 :
int main(void)
{
long a;
long i = 0;
for (i = 0; i < 10000000000l; i++) {
a = 10;
__asm__(
#if 0
"movq $0, %%rax"
#else
"xorq %%rax, %%rax"
#endif
: "=a" (a) : "a" (a))
}
return 0;
}
그러나 때 시간 (한 번 #if 1
에 한 번 #if 0
와) 프로그램, 나는 매우 비슷한 결과 (5.876 ± 0.001 초)가 계속합니다. 참고로, 저비용 조정기를 가장 낮은 주파수로 설정했고 사용자 회선이 time(1)
에 의해 반환되었는지 확인했습니다.
나는 또한 addq %rax,%rax
대 imulq $2,%rax
으로 시도했지만 다시 운이 없었습니다.
나는 최신 프로세서가 코드 실행을 최적화하는 데 매우 영리하다는 것을 알고 있으며 이것이 내가 도움이되는 결과를 얻지 못하는 이유라고 생각합니다. 그래서 저는 물어볼 것입니다 : 어떻게해야합니까? 나는 올바른 길을 가고 있는가?
@MikeDunlavey : 네, 맞습니다. 나는 루프를 변경하고 단지 하나 대신 intermation 당 16_movq/xorq_를 사용했다. 이제 나는 약간의 차이점을보기 시작했습니다. http://pastebin.com/QfWjAGvj – user16538
@MikeDunlavey를 참조하십시오. _addq_와 _imulq_의 차이는 거의 10 초입니다. 귀하가 귀하의 의견을 답변으로 바꾸면 최대한 빨리 동의하겠습니다. – user16538
다른 장점이 있습니다. 'xorl % eax, % eax'를 사용하여 64 비트 레지스터를 0으로 만들 수 있습니다. 그러나'movl '로도이 작업을 수행 할 수 있지만 여전히 바이트 수가 더 적습니다. 'xor R, R' 패턴은 의존성 차단기이기도하며, 새로운 아키텍처에서는 실행 단위 (대기 시간 없음)를 필요로하지 않습니다. –