는 고성능 라이브러리 구현에서이 코드코드 비교 및 성능
double meanQ=0;
int counter=0;
for(...){
//some cycle with many iterations where meanQ and counter are incremented
}
meanQ /= (double)counter + 0.001D;
마지막 줄이 나에게 혼란을 보이는 것을 보았다. counter
가 meanQ
도 0
입니다 다음, 0
때 난 그냥 그렇지 않으면 counter
으로 나누어,
if(counter>0)
meanQ /= counter;
할 것입니다. 또한 (약간) 평균보다 정확하고 캐스트가 없으므로 이해하기가 더 쉽습니다. Afaik, if
과 합계가 비슷한 성능을 가져야하지만 지금은 내 컴퓨터에서 테스트 할 수 없습니다.
두 방법의 차이점은 무엇입니까? 현재 라이브러리 버전이 더 나은 성능을 보이고 있습니까, 아니면 내 제안에 따라 다른 동기를 선택할 수 있습니까? meanQ /= (double)counter + 0.001D;
루프 내에 있으면
글쎄, 거기에 캐스트가 확실히 필요하지 않습니다. int + double은 항상 double을 반환합니다. D 접미사 또한 불필요합니다. 이것은 라이브러리 품질에 대한 신뢰를 전혀 권장하지 않습니다 :-) –
올바른 해결책 ('if ...')을 시도하고 양쪽 버전을 벤치마킹하십시오. 그것은 심지어 차이를 만드나요? – Axel
루프와 비교할 때 성능은 무시할 수 있기 때문에 여기서는 그렇지 않습니다. 나는 미래의 참고 문헌에 대한 대답을 대부분 원했다. 그러나 atm에서 테스트 할 기계가 없으므로 부동 소수점 연산 (특히 배정 밀도 포함)은 비교적 느리므로 – BlueMoon93