2014-08-28 2 views
-4

다음 코드는 동일한 로직을 사용합니다 (x는 0 또는 1 만 해당). 더 빠르게 실행되는 코드는 무엇입니까?보다 빠른 조건 확인

첫 번째 코드 :

if (x == 1) 
{ 
    y = 10; 
} 

두 번째 코드 :

if (x != 0) 
{ 
    y = 10; 
} 

셋째 코드 :

if (x) 
{ 
    y = 10; 
} 
+1

정확하게 동일한 실행 시간이라고 말할 수 있습니다. – Charleshaa

+1

가능성은 동일하지만 CPU 및 컴파일러에 따라 다릅니다. 컴파일러에서 어셈블리 ('-S' 옵션)를 생성 시키거나 컴파일 된 결과를 분해하여 확인하지 않는 것이 어떻습니까? – lurker

+0

잘못 편집했습니다 ("x 1 또는 0"이어야 함). 그러나, 어떤 C 코더도'if (x) {...}'를 쓸 것입니다. – Evert

답변

2

이것은 아키텍처에 따라 다릅니다. 0과 비교하는 많은 8 비트 마이크로 컨트롤러에서 단일 명령어가 필요하지만 0 이외의 특정 수를 비교하면 두 명령어가 필요합니다.

첫 번째 코드는 다음에 번역 것 :

LDAA x 
CMPA #1 
BNE loc 
... 

이 레지스터에 x로드는 1에 등록을 비교하고 평등 이동합니다. 여기에 번역 할

두 번째 코드 : 레지스터에

LDAA x 
BNE loc 

로드 x 지금 당장 할 수있는 제로 평등에 점프, 제로 플래그를 설정합니다. 이렇게하면 2 바이트의 코드 메모리와 2 CPU 사이클을 절약 할 수 있습니다.

작은 샘플을 어셈블리로 컴파일하거나 실제 코드를 분해하여 플랫폼에서 이러한 현상이 발생하는지 확인할 수 있습니다.

+0

감사합니다. 말이된다. –

1

당신은 할 수 있습니다 그것을 측정 할 수는 있지만, 그 둘은 정확하게 같은 속도 방향입니다 (기계 코드 레벨에서는 꽤 비슷합니다).

+2

x가 이전 계산의 결과 인 경우 컴파일러는 두 번째 대/소문자에있는 잔여 Zero 플래그를 기반으로 직접 점프 할 수 있습니다. 첫 번째 경우에는 비교가 필요합니다. – Quentin

+1

@Quentin 물론 컴파일러가 x가 부울임을 알지 않는 한. 질문은 컴파일러가 그 사실을 식별/악용하지 못할 수도 있지만 (그렇지 않으면 세 가지 옵션이 동일하지 않음을 의미합니다). –