선생님이 말씀하신 내용은 명확하지 않은 약간의 진술입니다. 감소가 증분보다 빠르지는 않지만 증분보다 감소로 훨씬 빠른 루프를 만들 수 있습니다.
루프 카운터 등을 사용할 필요없이 길이에 관계없이 속도와 루프 수 (0이 아님)가 중요합니다.
대부분의 사람들이 10 회 반복하여 루프를 구현하는 방법은 다음과 같습니다.
int i;
for (i = 0; i < 10; i++)
{
//something here
}
99 %의 경우 모두 필요하지만 PHP, PYTHON, JavaScript와 함께 CPU 틱이 정말로 중요한 세계적으로 중요한 소프트웨어 (일반적으로 임베디드, OS, 게임 등)가 있으므로 어셈블리 코드를 간단히 살펴보십시오.
int i;
for (i = 0; i < 10; i++)
{
//something here
}
컴파일 후 (최적화없이) 컴파일 된 버전은 다음과 같습니다 (VS2015).
-------- C7 45 B0 00 00 00 00 mov dword ptr [i],0
-------- EB 09 jmp labelB
labelA 8B 45 B0 mov eax,dword ptr [i]
-------- 83 C0 01 add eax,1
-------- 89 45 B0 mov dword ptr [i],eax
labelB 83 7D B0 0A cmp dword ptr [i],0Ah
-------- 7D 02 jge out1
-------- EB EF jmp labelA
out1:
전체 루프는 8 개의 명령어 (26 바이트)입니다. 그 안에는 실제로 2 개의 분기가있는 6 개의 명령어 (17 바이트)가 있습니다. 예, 나는 그것이 더 잘 할 수 있다는 것을 알고 있습니다 (그냥 예일뿐입니다).
이제 임베디드 개발자가 작성하는 빈번한 구성을 고려하십시오.
i = 10;
do
{
//something here
} while (--i);
또한 10 번 반복합니다 (예 : for 루프와 비교하여 i 값이 다르다는 것을 알고 있지만 반복 횟수는 여기서 중요합니다). 이것은 이것으로 컴파일 될 수 있습니다 :
00074EBC C7 45 B0 01 00 00 00 mov dword ptr [i],1
00074EC3 8B 45 B0 mov eax,dword ptr [i]
00074EC6 83 E8 01 sub eax,1
00074EC9 89 45 B0 mov dword ptr [i],eax
00074ECC 75 F5 jne main+0C3h (074EC3h)
5 개의 명령어 (18 바이트)와 단 하나의 브랜치 실제로 루프에는 4 개의 명령어가 있습니다 (11 바이트).
가장 좋은 점은 일부 CPU (x86 / x64 호환 포함)에 레지스터를 감소시킬 수있는 명령이 있고, 결과를 0과 비교하고 결과가 0과 다른 경우 분기를 수행하는 것입니다. 거의 모든 PC CPU가이 명령어를 구현합니다. 그것을 사용하면 루프는 실제로 하나의 (예 하나) 2 바이트 명령입니다.
00144ECE B9 0A 00 00 00 mov ecx,0Ah
label:
// something here
00144ED3 E2 FE loop label (0144ED3h) // decrement ecx and jump to label if not zero
어느 것이 더 빠른지 설명해야합니까?
이제 특정 CPU가 위의 명령을 구현하지 않더라도 이전 명령의 결과가 0이면 조건을 뛰어 넘고 감소시키는 에뮬레이션에 필요한 모든 것입니다.
따라서 어떤 경우에 관계없이 내가 왜 잘못되었는지 등의 의견으로 지적 할 수 있습니다.
추신. 예, 현명한 컴파일러 (적절한 최적화 수준의)는 루프 (오름차순 루프 카운터 사용)를 위해 루프를 다시 작성한다는 것을 알고 있습니다.