while (condition) {
...
}
워크 플로우 :
- 상태 확인;
- 거짓이면 루프 외부로 점프합니다.
- 한 번의 반복을 실행하십시오.
- 맨 위로 이동합니다.
if (condition) do {
...
} while (condition);
워크 플로우 :
- 상태 확인;
- 거짓이면 루프 너머로 점프합니다.
- 한 번의 반복을 실행하십시오.
- 상태 확인;
- 참이면 3 단계로 이동합니다.
이 두 가지를 비교하면 루프를 통해 정확히 한 단계가 있고 일반적으로 점프 수가 반복 수보다 하나 적다면 후자가 점프를 전혀 수행하지 않을 수 있음을 쉽게 알 수 있습니다. 전자는 조건을 확인하기 위해 다시 점프해야하며 조건이 거짓 일 때만 루프에서 점프해야합니다.
최신 파이프 라인 CPU 아키텍처에서 점프는 비용이 많이들 수 있습니다. CPU가 점프 전에 검사 실행을 완료하고 있으므로 해당 점프를 넘어서는 명령은 이미 파이프 라인 중간에 있습니다. 분기 예측이 실패하면이 모든 처리를 폐기해야합니다. 파이프 라인이 다시 시작되는 동안 추가 실행이 지연됩니다.
언급 된 분기 예측 설명 : 각 종류의 조건부 점프에 대해 CPU에는 결과에 대한 베팅 을 포함하는 두 개의 명령이 있습니다. 예를 들어, 마지막 반복을 제외한 모든 반복에서 점프가 이루어져야하기 때문에 루프 끝에 " 0이 아니면 점프, 0이 아닌 것에 베팅 "이라는 명령을 넣을 수 있습니다. 이렇게하면 CPU가 점프 명령 자체를 따르는 명령 대신 점프 대상을 따르는 명령으로 파이프 라인을 펌핑하기 시작합니다.
중요 사항
마십시오 하지 소스 코드 수준에서 최적화하는 방법의 예로서이 걸릴. 질문에서 이미 분명한 것처럼 첫 번째 형식에서 두 번째 형식으로의 변환은 JIT 컴파일러가 루틴의 문제로 완전히 자체적으로 수행하기 때문에 완전히 잘못된 것입니다.