문제

더 빠른 코드로 컴파일됩니다."ans = n * 3" 또는 "ans = n+(n*2)"?

n이 int 또는 long이고 최신 Win32 Intel 상자에서 실행되고 있다고 가정합니다.

역참조가 포함되어 있다면 이것이 달라질까요? 즉, 이들 중 어느 것이 더 빠를까요?

long    a;
long    *pn;
long     ans;

...
*pn = some_number;
ans = *pn * 3;

또는

ans = *pn+(*pn*2);

아니면 최적화 컴파일러가 어떤 경우에도 이를 설명할 가능성이 높으므로 걱정할 필요가 없는 것입니까?

도움이 되었습니까?

해결책

IMO에서는 이국적인 컴파일러를 사용하지 않는 한 이러한 미세 최적화가 필요하지 않습니다.나는 가독성을 최우선으로 생각합니다.

다른 팁

그것은 중요하지 않습니다.최신 프로세서는 MUL을 수행하기 위해 일련의 교대를 수행하고 내부적으로 추가하여 여러 사이클을 사용해야 했던 이전 프로세서와 달리 한 클록 사이클 이하에서 정수 MUL 명령을 실행할 수 있습니다.나는 그럴 것이라고 확신한다

MUL EAX,3

보다 빠르게 실행

MOV EBX,EAX
SHL EAX,1
ADD EAX,EBX

이러한 종류의 최적화가 유용했을 수 있는 마지막 프로세서는 아마도 486이었을 것입니다.(예, 이는 인텔 프로세서에 편향되어 있지만 아마도 다른 아키텍처도 대표할 수 있습니다).

어떤 경우든 합리적인 컴파일러라면 가장 작고 빠른 코드를 생성할 수 있어야 합니다.따라서 항상 가독성을 먼저 고려하십시오.

스스로 측정하기 쉽기 때문에 그렇게 해보는 것은 어떨까요?(사용 gcc 그리고 time 시그윈에서)

/* test1.c */
int main()
{
    int result = 0;
    int times = 1000000000;
    while (--times)
        result = result * 3;
    return result;
}

machine:~$ gcc -O2 test1.c -o test1
machine:~$ time ./test1.exe

real    0m0.673s
user    0m0.608s
sys     0m0.000s

몇 번 테스트를 수행하고 다른 경우에도 반복합니다.

어셈블리 코드를 엿보고 싶다면, gcc -S -O2 test1.c

이는 컴파일러, 구성 및 주변 코드에 따라 달라집니다.

측정을 하지 않고 상황이 '더 빠른지' 추측하려고 해서는 안 됩니다.

일반적으로 요즘에는 이런 종류의 나노 규모 최적화에 대해 걱정할 필요가 없습니다. 거의 항상 전혀 관련이 없으며, 정말로 중요한 영역에서 작업하고 있었다면 이미 프로파일러를 사용하고 컴파일러의 어셈블리 언어 출력을 보고 있었을 것입니다. .

컴파일러가 귀하의 코드로 무엇을 하고 있는지 알아내는 것은 어렵지 않습니다(여기서는 DevStudio 2005를 사용하고 있습니다).다음 코드를 사용하여 간단한 프로그램을 작성해 보세요.

int i = 45, j, k;
j = i * 3;
k = i + (i * 2);

중간 줄에 중단점을 배치하고 디버거를 사용하여 코드를 실행합니다.중단점이 트리거되면 소스 파일을 마우스 오른쪽 버튼으로 클릭하고 "Go To Disassemble"을 선택합니다.이제 CPU가 실행 중인 코드가 포함된 창이 나타납니다.이 경우 마지막 두 줄은 정확히 동일한 명령, 즉 "lea eax,[ebx+ebx*2]"(이 특별한 경우에는 비트 이동 및 추가가 아님)를 생성한다는 것을 알 수 있습니다.최신 IA32 CPU에서는 수정된 값을 너무 빨리 사용할 때 패널티가 발생하는 CPU의 파이프라인 특성으로 인해 비트 이동보다 직선 MUL을 수행하는 것이 더 효율적일 수 있습니다.

이는 aku가 말하는 내용, 즉 컴파일러가 코드에 가장 적합한 지침을 선택할 만큼 영리하다는 것을 보여줍니다.

실제로 사용하는 컴파일러에 따라 다르지만 아마도 동일한 코드로 변환될 가능성이 높습니다.

작은 테스트 프로그램을 만들어서 분해해보면 직접 확인해 볼 수 있습니다.

대부분의 컴파일러는 정수 곱셈을 일련의 비트 이동 및 덧셈으로 분해할 만큼 똑똑합니다.나는 Windows 컴파일러에 대해 모르지만 적어도 gcc를 사용하면 어셈블러를 뱉어낼 수 있으며, 이를 살펴보면 두 가지 작성 방법 모두에 대해 동일한 어셈블러를 볼 수 있을 것입니다.

그것은 상관하지 않습니다.최적화하는 것이 더 중요하다고 생각합니다.혼자서 코딩하고 테스트하는 대신 해당 질문을 생각하고 작성하는 데 얼마나 많은 시간을 투자하셨나요?

:-)

괜찮은 최적화 컴파일러를 사용하는 한, 컴파일러가 이해하기 쉬운 코드 작성.이렇게 하면 컴파일러가 영리한 최적화를 더 쉽게 수행할 수 있습니다.

귀하가 이 질문을 한다는 것은 최적화 컴파일러가 귀하보다 최적화에 대해 더 많이 알고 있음을 나타냅니다.그러니 컴파일러를 믿으세요.사용 n * 3.

보세요 이 답변 또한.

컴파일러는 귀하의 코드와 같은 코드를 최적화하는 데 능숙합니다.최신 컴파일러는 두 경우 모두에 대해 동일한 코드를 생성하고 추가로 대체합니다. * 2 왼쪽 시프트로.

그런 작은 코드 조각을 최적화하려면 컴파일러를 믿으십시오.가독성은 코드 수준에서 훨씬 더 중요합니다.진정한 최적화는 더 높은 수준에서 이루어져야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top