2016-09-23 2 views
1

질문은 매우 간단합니다. - 함수에 제공된 실제 매개 변수를 검사하면 성능이 저하됩니까?실제 매개 변수 점검 성능 영향

수출 라이브러리 함수는 일반적으로 사용자 코드에 의해 전달 된 실제 매개 변수를 확인하는 경향이 :

if (arg1 == NULL || arg2 == NULL) 
    return -EINVAL; 

이 검사는 성능 저하를 초래 하는가? 내게 잘 작동 사용자가되고 항상 유효한 매개 변수를 전달하는 것에 의존하는) 내 보낸 함수 중 일부에서 이러한 검사를 제거하여 일부 라이브러리 코드를 최적화하려고했지만 실제 개선이 없다고 나타났습니다.

내 첫 번째 추측은 현대 프로세서의 분기 예측이 if 분기가 취해지지 않고 실제적인 페널티가없는 코드로 진행된다고 가정합니다. 이것이 실제로 이유 인 경우 - 그러한 분기 예측 메커니즘의 한계는 무엇입니까? 이러한 검사를 제거하면 성능이 향상 될 수있는 시나리오가 있습니까? C와 같은 원시 컴파일 언어와 Python 및 Java와 같은 해석 또는 VM 언어 간의 차이점은 무엇입니까?

BTW - 런타임 매개 변수를 확인하는 것이 중요하다는 것을 알고 있습니다. 나는 단지 성과 측면에 관심이있다.

+0

정말 이런 종류의 벤치마킹이 필요합니다. 확실하게 대답 할 수있는 와트가 없습니다. 또한 리눅스 커널의'__likely' 매크로와'__unlikely' 매크로를 살펴보십시오. –

+0

[this] (http://stackoverflow.com/a/11227902/2681632)가 흥미로울 수 있습니다. –

+0

더 나은 질문은 'NULL'에 대한 인수를 확인하는 것이 유용한 작업을 수행하는지 여부입니다. 유효한 입력을 기대하는 함수에 넘겨서는 안되는 * 많지 않은'NULL' 포인터가 있습니다. 'assert()'가 더 합리적 일 수 있습니다. – EOF

답변

1

인수의 검사가 값 비교처럼 단순하면이 검사를 제거하지 않아서 성능이 향상됩니다. 배열의 모든 항목을 검사하거나 다른 매개 변수를 호출하여 각 매개 변수를 검사하는 것과 같이 검사가 복잡하면 성능이 약간 향상 될 수 있습니다.

잘 작성된 라이브러리에서 이러한 종류의 매개 변수 검사는 시간이 많이 걸리지 않아야합니다. 개발에 영향을 미치는 병목 현상을 찾으려는 경우 코드 실행을 벤치 마크/프로파일 링하여 "코드/함수의 어느 라인"이 실행에 더 많은 시간을 할애하고이를 개선하는 데 집중해야하는지 결정해야합니다.