0

이 질문은 코드 최적화에 관한 것이 아니라 단락 논리 연산자와 정상 논리 연산자의 성능 차이에 대한 기술적 질문으로, 하드웨어 수준에서 수행되는 방법에 따라 내려갈 수 있습니다. .왜 단락 논리 연산자가 더 빠를 것인가?

기본적으로 논리적 인 ANDOR은 1 사이클을 소요하는 반면 단락 회로 평가는 분기를 사용하고 다양한 양의 사이클을 취할 수 있습니다. 이제 분기 예측자는이 평가를 효율적으로 수행 할 수 있음을 알고 있지만 1주기보다 빠른 방법을 보지 못합니까?

예, 오른쪽 피연산자가 비용이 많이 드는 경우 평가하지 않으려 고하면 유용합니다. X & (Y | Z)과 같은 간단한 조건의 경우 원자 변수라고 가정 할 때 비 단락 논리 연산자가 더 빠르게 수행됩니다. 내가 맞습니까? 순서로 명령을 실행하는 동안 그 점프를 만드는 방법 다른 사람 때문에


나는 (단지 자기 생각, 공식적인 소스) 단락 회로 논리 연산자 사용이 분기 없다고 가정한다?

+3

이것은 새로운 생각은 아니지만 실제로 사이드 바에 * 관련되어있는 몇 가지 관련 답변이 있으며 [컴파일러도 이에 대해 알고 있습니다.] (https://godbolt.org/g/zU34MZ) - '&&'단락은 실제로 단락없이 구현됩니다. – harold

+0

@harold 잘 알고 있습니다. 그래서 내 가정은 옳았다. 좋은 컴파일러는 그것을 돌볼 수 있습니다. –

+0

및 and 및 또는 operation이 두 개 이상의 사이클을 사용하면 파이프 라인은 모든 것을 평균하여 한 사이클로 만듭니다. 마찬가지로 분기 및 분기 예측, 프리 페치 버퍼 등은 주목할만한 실속을 피하기 위해 파이프 가까이에 필요한 데이터를 얻으려고합니다. –

답변

-1

단락 논리 연산자는 일반 운영자보다 빠르며 낮은 수준의 HW와는 관련이 없습니다. AND 연산자는 다음 실행시의 양쪽 정상 및 연산자 평가 될 경우이 코드를

if((a == b) and (c == d)){ 
    do some thing; 
} 

을 간단히 경우,이 a == bc == d의 값이 모두 chcked된다는 것을 의미합니다. 여기에 하나의 질문이 있습니다. a == bfalse 인 경우 c == d을 전체적으로 확인하지 않아도되고 항상 false이됩니다. 단락 회로와 연산자는이 트릭을 사용하며,이 경우에 a == bfalse 인 경우, 결과가 알려지지 않은 조건을 확인하기 위해 CPU 사이클을 소비하지 않고 조건의 나머지 부분을 확인하지 않습니다.

관련 문제