이것은 실제로 학문적 질문 일 뿐이며, 어느 것이 더 빠르는지 궁금합니다. 나는 그 차이를 무시할 만하지만 아직도 알고 싶습니다.비용 == 연산자 vs < or > 연산자
if((x == 1) || (x == 2))
대
if (x < 3)
감사합니다!
이것은 실제로 학문적 질문 일 뿐이며, 어느 것이 더 빠르는지 궁금합니다. 나는 그 차이를 무시할 만하지만 아직도 알고 싶습니다.비용 == 연산자 vs < or > 연산자
if((x == 1) || (x == 2))
대
if (x < 3)
감사합니다!
제공된 양식에서 복잡성의 차이가 분명합니다. 첫 번째 코드는 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:
...
이 사업자 (jge
및 jne
다른 사람들이 점프)의 두같은 속도로 자신의 일을하고 있어요. 성능에 더 많은 영향을 주면 점프 거리 (코드 위치 차이), 캐시 미스 (프로세서가 점프를 잘못 예측 한 경우) 등이됩니다. 어떤 지침은 심지어 더 효과적입니다 (예를 들어 적은 수의 바이트 사용), 단 한 가지만 기억하십시오 : 많은주의를 기울이지 마십시오. 항상 algorythmic 최적화를 만드는 것이 좋으며, 성냥에 대한 비용 절감은하지 마십시오. 컴파일러가 당신을 위해 그것을하게하십시오 - 그것은 정말 그런 질문에 유능합니다. 당신의 algorythms, 코드 readablity, 프로그램 아키텍처, 결함 허용에 중점을 둡니다. 속도를 최우선으로 만드십시오.
(* 1) : http://en.wikipedia.org/wiki/FLAGS_register_%28computing%29
(* 2) : http://www.unixwiz.net/techtips/x86-jumps.html
을 그리고 당신이 시도 않았다 ...? 그리고 'x <3 '은 어셈블리 코드가 짧아 질수록 빠릅니다. 그리고 문제는 언어에 특화되어야합니다. – gdoron
이 두 조건은 동일하지 않습니다. '0 <3'하지만'! ((0 == 1) || (0 == 2))'입니다. –
예 larsmans과 -345도 <3입니다. 왜 그렇게 중요할까요? x가 1, 2, 3, 4 또는 5와 같은 다른 값을 가질 수 있다고 생각하는 이유는 무엇입니까? 어떤 경우에는 그 진술은 완벽하게 동일합니다 ... – Vincent