릴리스 모드에서 컴파일 된 코드의 디스 어셈블리를 보면 그 차이가 분명합니다! 인라인을 제거하고 두 개의 가상 함수를 사용하여 컴파일러가 너무 많이 최적화하지 못하게하고 차이점을 보여줍니다.
이것은 첫 번째 기능입니다.
013D1002 in al,dx
union {
float x;
int a;
} u;
u.x = x;
013D1003 fld dword ptr [x] // Loads a float on top of the FPU STACK.
013D1006 fstp dword ptr [x] // Pops a Float Number from the top of the FPU Stack into the destination address.
u.a &= 0x7FFFFFFF;
013D1009 and dword ptr [x],7FFFFFFFh // Execute a 32 bit binary and operation with the specified address.
return u.x;
013D1010 fld dword ptr [x] // Loads the result on top of the FPU stack.
}
이것은 두 번째 기능입니다.
013D1020 push ebp // Standard function entry... i'm using a virtual function here to show the difference.
013D1021 mov ebp,esp
int b= *((int *)&a) & 0x7FFFFFFF;
013D1023 mov eax,dword ptr [a] // Load into eax our parameter.
013D1026 and eax,7FFFFFFFh // Execute 32 bit binary and between our register and our constant.
013D102B mov dword ptr [a],eax // Move the register value into our destination variable
return *((float *)(&b));
013D102E fld dword ptr [a] // Loads the result on top of the FPU stack.
첫 번째 경우의 부동 소수점 연산 수와 FPU 스택 사용량이 더 큽니다. 함수는 여러분이 물어 본 것과 똑같이 실행되기 때문에 놀랄 일이 아닙니다. 그래서 두 번째 기능이 더 빨라질 것으로 기대합니다.
지금 ...가상 및 인라인 것들을 제거하는 것은 조금 다르다. 왜냐하면 컴파일러가 좋은 일을하기 때문에 여기서는 디스 어셈블리 코드를 작성하기가 어렵지만, 값이 상수가 아니라면 반복한다. 컴파일러는 처음에 더 많은 부동 소수점 연산을 사용할 것이다. 기능. 물론 정수 연산은 부동 소수점 연산보다 빠릅니다.
math.h abs 함수를 직접 사용하는 것이 메서드보다 느린 것이 확실합니까? 올바르게 인라인 된 경우 abs 함수가이 작업을 수행합니다! 이 같은
00D71016 fabs
마이크로 최적화는 긴 코드에 표시하기 어려운,하지만 기능은 부동 소수점 연산의 긴 사슬에서 호출되는 경우 값은 FPU 스택 또는 SSE 이미되기 때문에, 팹 더 나은 작동합니다 레지스터! abs는 컴파일러가 더 빠르고 더 잘 최적화 할 수 있습니다.
코드에서 루프를 실행하는 최적화 성능을 측정 할 수 없으므로 컴파일러가 실제 코드에서 모두 어떻게 혼합되는지 확인해야합니다.
버전에 비해'std :: abs' 시간은 얼마나 걸립니까? – avakar
btw ... 왜 std :: fabs를 사용하지 않습니까? 그 이유는 위의 작업을 수행하는 것보다 훨씬 빠를 절대 값 (인텔 아키텍처에서는 FABS 임)을 계산하기 위해 적절한 CPU 명령어 세트를 사용할 것이기 때문입니다. –
Ahmed Masud : 이것에 대해 확실합니까? 나는 그것을 지금 시험 할 것이다. ... 흠, 이유를 완전히 이해하지는 못했지만 간단한 fabs 기능이 가장 빠른 것으로 나왔습니다. 팹 - 0.922311, fastAbs (위에서) - 0.935108, Abs (또한 위에서) - 0.937011, 복근 - 0.936235. 이 부분이 궁금합니다. – Vadim