원래의 포스터에는 실제로 최적화 된 루프가 있다고 가정 해 봅시다. 그의 질문에 대한 답은 어떻게 경험적으로 파악할 수 있습니까?
gcc에는 적어도 '드물기는하지만'-S 스위치가 유용합니다. .c 파일의 어셈블리 코드 버전을 덤프하고 OP 포즈와 같은 질문에 대답하는 데 사용할 수 있습니다. 나는 간단한 프로그램 작성 :
int main()
{
int sum = 0;
for(int i=1;i<=10;++i)
{
sum = sum + i;
}
return sum;
}
을 그리고 실행 : gcc -O0 -std=c99 -S main.c
를, 메인 프로그램의 어셈블리 버전을 생성. 당신은 무슨 일이 일어나고 있는지 알아 내기 위해 조립 전문가가 될 필요가 없습니다
movl $0, -8(%rbp)
movl $1, -4(%rbp)
jmp .L2
.L3:
movl -4(%rbp), %eax
addl %eax, -8(%rbp)
addl $1, -4(%rbp)
.L2:
cmpl $10, -4(%rbp)
jle .L3
: 여기 (제거 보풀의 일부) main.s의 내용입니다. movl은 값을 이동하고, addl은 물건을 추가하고, cmpl은 비교하고, jle은 '미만이면 점프'를 의미하고, $는 상수를 의미합니다. 0을 무언가에로드하고 있습니다. 'sum'이어야하며, 1은 다른 것으로 들어가야합니다. - 아, 'i'! 우리가 10과 비교할 때 L2로 건너 뛰고, 추가를하기 위해 L3으로 건너 뜁니다. 비교를 위해 다시 L2로 내려갑니다. 산뜻한! for 루프.
변경 프로그램 :
int main()
{
int sum = 0;
int i=1;
for(;i<=10;++i)
{
sum = sum + i;
}
return sum;
}
다시 실행의 GCC 및 결과 어셈블리는 매우 유사합니다. 레코드 번호로 몇 가지 문제가 발생하므로 동일하지는 않지만 어셈블리가 동일하게 끝납니다. 마지막 사건과 같은 결과. 따라서 최적화가 없어도 코드는 거의 같습니다.
재미를 위해 gcc를 '-O0'대신 '-O3'으로 다시 실행하여 최적화를 활성화하고 .s 파일을 살펴보십시오.
main:
movl $55, %eax
ret
GCC는 우리가 루프를하고 있던 파악하지만, 또한, 시간의 상수는 컴파일시에 우리를 위해 루프를 한 실행했다 '내가'와 '합'을 밖으로 내 던졌다 실현되지 답을 하드 코딩했습니다 - 55! 조금 빨라졌지만 빠릅니다.
이야기의 도덕? 코드가 깨끗하고 잘 설계되었는지 확인하는 데 시간을 투자하십시오. 가독성과 유지 보수성을위한 코드. 마운틴 이슬과 치토에 살고있는 사람들은 우리보다 훨씬 똑똑하고 우리를 위해 이러한 간단한 최적화 문제를 돌봐 왔습니다. 재미있어!
이런 종류의 질문은 정말 나쁜 징조입니다 ... –
+1이 질문에 단지 신화가 디버프 될 수 있습니다. – Andres