2010-05-13 2 views
4

이의 두 라인 아마도 같은 일을 수행하는 간단한 예를 들어 보자 :C 구문 또는 이진 최적화 구문?

경우 (값을> = 128 || 값 < 0) ...

또는

경우 (값 & ~ 127) ...

수천 개의 반복 루프에서 비용이 많이 드는 경우 가능한 경우 이진 C 구문을 유지하거나 이진 최적화 된 구문을 찾는 것이 좋습니다.

+2

무엇을 달성 할 것입니까? 프로파일 링하고 알아보십시오. 당신이 차를 사려고한다면, 당신이 더 좋아하는 차량을 추측 할 것인가? 즉, 전자는 더 읽기 쉽고 중요한 것은 중요합니다. 컴파일러는 최적화 작업을하는 것이 좋습니다. 당신은 코드를 작성하고, 바이너리를 만듭니다. – GManNickG

+4

이러한 진술은 동일하지 않습니다. – ergosys

+0

이것은 2의 거듭 제곱으로 만 작동하지만 바이너리 코드의 사용이 컴파일러가 수행하는 것보다 빠를 수있는 예일뿐입니다. – Dpp

답변

3

더 읽기 쉽기 때문에 전통적인 구문의 첫 번째 문을 사용합니다. 두 번째 문장으로 눈을 깰 수 있습니다.

코드를 사용하는 프로그래머에 대한주의.

3

100 개 중 99 개가 더 읽기 쉽고 의도를 잘 표현합니다.

1

이론적으로 컴파일러는 이러한 종류의 최적화를 수행합니다. 실제로, 그렇지 않을 수도 있습니다. value에 대한 가정과 대상 플랫폼에서 부호가있는 산술 연산이 2의 보수인지 여부를 제외하고는이 두 예제가 동일하지 않기 때문에이 특정 예제는 약간 미묘합니다.

가독성이 높은 것을 사용하십시오. 이 특정 테스트의 성능이 중요하다는 증거가있는 경우 최상의 성능을 제공하는 것을 사용하십시오. 개인적으로, 나는 아마 작성합니다

if ((unsigned int)value >= 96U) 

을 그 날 더 직관적이며 내가 함께 작업 한 대부분의 컴파일러에 의해 잘 처리받을 가능성이 있기 때문에.

+0

당신은 연습 부분에 대해 옳았습니다. 대개 -o3 에서조차 너무 많이 최적화하지 않았기 때문에 제가 질문했습니다. 수천 번의 반복을 통해 차이가 커질 수 있습니다. 그 예에서 서명되지 않은 부분이 보이지 않습니까? – Dpp

+0

@Dpp :'value'가'int' 인 경우,'unsigned int'로 변환 될 때 음수 값이 96보다 커질 것이므로, <0을위한 별도의 테스트가 필요 없습니다. – caf

+0

호 예, 8 번째 비트가 1로 설정되어 있기 때문에 마음에 들어요! 그런 다음 사전 컴파일러가 더 잘 최적화 할 수 있습니다! – Dpp

1

방법/장소에 따라 다릅니다. 프로그램 시작 중에 명령 줄 매개 변수를 검사하기 위해 검사를 한 번 수행하면 성능 문제가 완전히 해결되지 않으므로 더 자연 스럽 게 사용해야합니다.

반면에 수표가 수천만 초 동안 발생하는 내부 루프 내부에 있으면 문제가 될 수 있습니다. 그러나 사람이 더 나아질 것이라고 가정하지 마십시오. 두 버전을 만들고 시간을 측정하여 두 버전간에 측정 가능한 차이가 있는지 확인해야합니다.