2016-10-13 4 views
2

는 고성능 라이브러리 구현에서이 코드코드 비교 및 ​​성능

double meanQ=0; 
int counter=0; 
for(...){ 
    //some cycle with many iterations where meanQ and counter are incremented 
} 
meanQ /= (double)counter + 0.001D; 

마지막 줄이 나에게 혼란을 보이는 것을 보았다. countermeanQ0입니다 다음, 0 때 난 그냥 그렇지 않으면 counter으로 나누어,

if(counter>0) 
    meanQ /= counter; 

할 것입니다. 또한 (약간) 평균보다 정확하고 캐스트가 없으므로 이해하기가 더 쉽습니다. Afaik, if과 합계가 비슷한 성능을 가져야하지만 지금은 내 컴퓨터에서 테스트 할 수 없습니다.

두 방법의 차이점은 무엇입니까? 현재 라이브러리 버전이 더 나은 성능을 보이고 있습니까, 아니면 내 제안에 따라 다른 동기를 선택할 수 있습니까? meanQ /= (double)counter + 0.001D; 루프 내에 있으면

+2

글쎄, 거기에 캐스트가 확실히 필요하지 않습니다. int + double은 항상 double을 반환합니다. D 접미사 또한 불필요합니다. 이것은 라이브러리 품질에 대한 신뢰를 전혀 권장하지 않습니다 :-) –

+0

올바른 해결책 ('if ...')을 시도하고 양쪽 버전을 벤치마킹하십시오. 그것은 심지어 차이를 만드나요? – Axel

+0

루프와 비교할 때 성능은 무시할 수 있기 때문에 여기서는 그렇지 않습니다. 나는 미래의 참고 문헌에 대한 대답을 대부분 원했다. 그러나 atm에서 테스트 할 기계가 없으므로 부동 소수점 연산 (특히 배정 밀도 포함)은 비교적 느리므로 – BlueMoon93

답변

0

는,이 코드는 코드를 갖는 후자보다 빠르다 : 루프에서

if(counter>0) 
    meanQ /= counter; 

.

모든 반복마다 카운터가 0인지 확인하고 if()를 사용하면 상당한 차이가 날 필요가 있기 때문입니다.

sum과 if()는 같은 복잡성을 가지지 않습니다.

+0

벤치 마크 할 수 없습니다. 그러므로 나는 틀렸다고 가정합니다. – Robert

+0

나는 현대의 프로세서에서 부동 소수점 연산이 더 느리지 않으며 사이클 당 4 또는 8 부동 소수점 연산을 수행하는 벡터 레지스터가 있다고 생각한다. 임베디드 시스템과 같이 장치에 실제로 제한된 리소스가 없다면 if()는 성능이 저하 될 때 더 중요한 영향을 미칩니다. –

+0

그것은'if' 밖에 있습니다. 나는 명확성을 위해 질문을 편집했다. – BlueMoon93