2012-06-24 4 views
-5

이것은 실제로 학문적 질문 일 뿐이며, 어느 것이 더 빠르는지 궁금합니다. 나는 그 차이를 무시할 만하지만 아직도 알고 싶습니다.비용 == 연산자 vs < or > 연산자

if((x == 1) || (x == 2)) 

if (x < 3) 

감사합니다!

+3

을 그리고 당신이 시도 않았다 ...? 그리고 'x <3 '은 어셈블리 코드가 짧아 질수록 빠릅니다. 그리고 문제는 언어에 특화되어야합니다. – gdoron

+2

이 두 조건은 동일하지 않습니다. '0 <3'하지만'! ((0 == 1) || (0 == 2))'입니다. –

+0

예 larsmans과 -345도 <3입니다. 왜 그렇게 중요할까요? x가 1, 2, 3, 4 또는 5와 같은 다른 값을 가질 수 있다고 생각하는 이유는 무엇입니까? 어떤 경우에는 그 진술은 완벽하게 동일합니다 ... – Vincent

답변

5

제공된 양식에서 복잡성의 차이가 분명합니다. 첫 번째 코드는 3 연산자를 사용하고 두 번째 코드는 두 번째 코드를 사용합니다. 하지만 OK,이 코드를 입력하고 > (또는 <)과 == (!=)을 비교한다고 가정합니다. 당신은 코드를 발견 할 프로그램을 섹터가있는 동안 당신이 이제까지 어셈블러에 직면했다 (하지만 난 당신이하지 않았다 내기)하면

if (x < 3) /* action */; 

은 (86 CPU 용)처럼 매끄러운 번역되고 : 이제

cmp %eax, 3 // <-- compare EAX and 3. It modifies flags register(*1) (namely ZF, CF, SF and so on) 
    jge @@skip // <-- this instruction tells CPU to jump when some conditions related to flags are met(*2). 
       // So this code is executed when jump is *not* made (when x is *not* 
       // greater or equal than 3. 
    /* here is action body */ 
@@skip: 
    // ... 

if (x == 3) /* action */; 

그것은 거의 동일한 어셈블리를 줄 것이다 (물론, 그것은 의미 광산에서 차이가 있지만하지 않을 수 있습니다) :

이 코드를 고려 (CPU가 그렇게 만들어지기 때문에,하지만 분명히 아키텍처에 따라 다름)
cmp %eax, 3 
    jne @@skip // < -- here is the only difference 
    /* action is run when x is equal to 3 */ 
@@skip: 
    ... 

이 사업자 (jgejne 다른 사람들이 점프)의 두같은 속도로 자신의 일을하고 있어요. 성능에 더 많은 영향을 주면 점프 거리 (코드 위치 차이), 캐시 미스 (프로세서가 점프를 잘못 예측 한 경우) 등이됩니다. 어떤 지침은 심지어 더 효과적입니다 (예를 들어 적은 수의 바이트 사용), 단 한 가지만 기억하십시오 : 많은주의를 기울이지 마십시오. 항상 algorythmic 최적화를 만드는 것이 좋으며, 성냥에 대한 비용 절감은하지 마십시오. 컴파일러가 당신을 위해 그것을하게하십시오 - 그것은 정말 그런 질문에 유능합니다. 당신의 algorythms, 코드 readablity, 프로그램 아키텍처, 결함 허용에 중점을 둡니다. 속도를 최우선으로 만드십시오.

(* 1) : http://en.wikipedia.org/wiki/FLAGS_register_%28computing%29
(* 2) : http://www.unixwiz.net/techtips/x86-jumps.html

+3

좋은, 자세한, 그리고 무엇보다도, 정답! –

+0

@DavidTitarenco, 감사합니다) –

+0

정말이 답변을 주셔서 감사합니다. – Vincent