2017-12-17 13 views
3

둘 다 : <빠른 ++ C의 어느 : 난 <= N 또는 난 N + 1 회 실행한다 - 루프 다음의 N + 1

for(int i = 0; i <= N; ++i); 
for(int i = 0; i < N + 1; ++i); 

I < 두 식 (중 = N 또는 i < N + 1)을 계산하는 것이 더 빠릅니까? 나는 유사한 질문이 있다는 것을 알고있다. (Is < faster than <=?), 그러나 이것은 상수가 아닌 변수에 1을 더하고, 상수가 아닌 변수를 1에 더하고 그 값을 i와 비교하기 때문에 다르다.

+9

동일한 어셈블리가 발생하더라도 나는 놀라지 않을 것입니다. – tkausl

+0

컴파일러는 여러분이 생각하는 것보다 똑똑합니다. 알고 싶다면 자신의 타이머를 사용하거나 프로파일 러를 사용하십시오. 어쨌든 당신의 N + 1은 N 번 계산되지 않으므로 나는 그 점을 보지 못합니다 ... – RaphaMex

+0

명확성을 기하기 위해 작성하십시오. 마이크로 최적화가 아닙니다. 최적화를 시도하는 befroe를 측정하십시오. –

답변

5

먼저 N이 상수이면 컴파일러는 컴파일시에 N+1을 계산하고 두 옵션에 대해 같은 수의 명령어를 생성합니다. 변수 대 상수 비교의 경우는 this Q&A에서 잘 설명됩니다.

N이 값이 런타임에만 사용 가능한 변수 인 경우 적극적인 최적화 수준에서 실행되는 컴파일러는 두 비교에 대해 동일한 코드를 생성 할 수 있습니다.

scanf("%d%d", &j, &k); 
if (j < k+1) { 
    printf("hello\n"); 
} 

scanf("%d%d", &j, &k); 
if (j <= k) { 
    printf("hello\n"); 
} 

내가 완전히 발현을 최적화에서 컴파일러를 방지하기 위해 scanf을 사용 :

나는이 두 가지 코드 조각 그것을 제공 -O3 최적화 수준에서 실행 gcc와 실험을 실행 . 두 경우 모두에서 제조

어셈블리 코드는 동일 하였다 :

movl -8(%rbp), %eax 
cmpl -4(%rbp), %eax 
jg  LBB0_2 

그것이 kj 비교하고 j 초과 k이었다 ( puts 호출로 대체 최적화) printf의 호출을 통해 뛰어.

+2

잘 했어! 컴파일러가하는 것을 가정하지 마십시오. 그냥 확인해. 이유를 이해하지 않고 N = 16과 N = 17에 대해 다르게 컴파일 할 수 있습니다. 예, 저에게 일어났습니다. – RaphaMex

+0

'N'이 적절한 연산을 지원하는 클래스 유형의 객체 인 경우에 대해서도 언급하고 싶을 수도 있습니다. – Peter