대학에서 8086 어셈블리를했을 때부터는 다음과 같이하는 것이 더 성능이 좋았던 것을 기억합니다.
for (int i = 6; i > -1; i--)
있었기 때문에 서명이 없으면 점프를 의미 JNS 작업 입니다. 이를 사용하면 비교 값을 얻기 위해 각주기 후에 메모리 조회가없고 비교도 수행되지 않습니다. 요즘 대부분의 컴파일러는 레지스터 사용을 최적화하므로 메모리가 더 이상 중요하지 않지만 여전히 불필요한 비교를 얻을 수 있습니다.
그건 그렇고 당신의 루프에 7이나 6을 넣는 것은 " 매직 넘버 "를 도입하는 것 입니다. 가독성을 높이려면 Intent Revealing Name과 함께 상수를 사용해야합니다. 이렇게 :
const int NUMBER_OF_CARS = 7;
for (int i = 0; i < NUMBER_OF_CARS; i++)
편집 : 사람들은 어셈블리를 얻지 못하므로 더 완전한 예가 분명히 필요합니다.
(i = 0; i <= 10; i ++)에 대해 수행하는 경우 다음을 수행해야합니다.
mov esi, 0
loopStartLabel:
; Do some stuff
inc esi
; Note cmp command on next line
cmp esi, 10
jle exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
for (int i = 10; i> -1; i--)를 수행하면 다음과 같이 벗어날 수 있습니다.
mov esi, 10
loopStartLabel:
; Do some stuff
dec esi
; Note no cmp command on next line
jns exitLoopLabel
jmp loopStartLabel
exitLoopLabel:
방금 확인한 결과 Microsoft의 C ++ 컴파일러는이 최적화를 수행하지 않지만 다음과 같은 경우 수행합니다.
for (int i = 10; i >= 0; i--)
따라서 Microsoft C ++ †를 사용하고 있고 오름차순이나 내림차순이 차이가없는 경우 빠른 루프를 사용하려면 다음을 사용해야합니다.
for (int i = 10; i >= 0; i--)
다음 중 하나가 아닌 :
for (int i = 10; i > -1; i--)
for (int i = 0; i <= 10; i++)
그러나 솔직히 "for (int i = 0; i <= 10; i ++)"의 가독성을 얻는 것이 일반적으로 하나의 프로세서 명령을 누락하는 것보다 훨씬 더 중요합니다.
† 다른 컴파일러는 다른 작업을 수행 할 수 있습니다.