2012-09-18 3 views
6

전체 공개가 - 나는 옆으로, 내가 +=-=을 테스트하기로 결정 Is x += a quicker than x = x + a?+가 + =보다 빠름 - =?

에 의해 영감을했다. 간단한 테스트 결과 거의 동일하다는 것을 알 수 있습니다. duuuh (k는, 말, 작은 경우

long long sum = 0; 

for (each number in the array) 
    if (x[j] < k) 
     sum += x[j]; 
    else 
     sum -= x[j]; 

때문에, -= 더 자주 전화를받을 것이다 :

std::vector<int> x; 
for (int i = 0 ; i < 10000 ; i++) 
    x.push_back(rand()%10); 

및 전화 +=-= 비례 주어진 번호 : 그럼 난 비슷한 시도). 나는 -=이라는 더 높은 비율을 가지고 k = 5이라는 더 높은 비율을 줄 수있는 k = 2을 시도했는데, 이는 -=+=과 거의 같은 수를 산출 할 것입니다.

펀치 라인 : -=을 호출하면 +=에 전화하는 것보다 약 2 배 빠릅니다. 이 경우 왜 더 효율적인가?

+4

나는 "영감을받는"것이 더 좋다고 생각합니다. – Mysticial

+0

아마도 A + B가 A + (-B) 인 것을 고려하면 A + B에 약간의 이점이 있습니다. – nullpotent

+7

두 단어 : 분기 예측. 힌트 : k = 8 시도하십시오. –

답변

15

I'm gonna jump in before Mysticial gets a hold of this and guess: branch prediction.

그래서, +=-= 아니다.

x[j] < k의 조건은 거의 항상 true 또는 false 일 때 더 잘 예측할 수 있습니다. 어느 쪽이든 평가할 수있는 숫자와 거의 같은 수일 때보다 좋습니다.

k = 2의 경우 10의 1은 false으로 평가됩니다.

k = 5의 경우, 거의 동일하며 임의로 배포되므로 예측하기가 어려울 수 있습니다.

편집 : http://ideone.com/1PYMl을 참조하십시오. 사용하지 않는 코드 최적화 (cout)를 방지하기 위해 모든 추가 작업이 있습니다.

TL; DR : k 변화에 대한 결과 : 당신이 볼 수있는

k: 1 Time: 280 
k: 2 Time: 360 
k: 3 Time: 440 
k: 4 Time: 520 
k: 5 Time: 550 
k: 6 Time: 510 
k: 7 Time: 450 
k: 8 Time: 360 
k: 9 Time: 260 

, k 가까이는 프로그램이 더 소요하는 무질서하게 변화하는 상태로 가져옵니다. 끝 부분을 향해, 그것은 약 절반의 시간이 걸립니다.

+4

그래서 분기 예측에 대해서 예측하면 –

+0

정확히 똑같은 것을 말하려고합니다. 또한 주요 질문에 대한 답변을 얻기 위해 거의 모든 아키텍처에서 추가 및 하위 명령어 _ 기본적으로 동일한 시간이 필요합니다. – slugonamission

+0

@ 신비로운 헤이 - 나는 연결되어있다 : P –

관련 문제