2012-03-04 3 views
2

절차 적 프로그래밍과 관련하여 기능적 분해는 복잡한 코드를 유지 관리하는 데 이상적입니다. 그러나 함수는 호출 스택에 추가하고 매개 변수를 전달하며 반환 주소를 저장하는 데 비용이 많이 듭니다. 이 모든 것은 여분의 시간이 필요합니다! 속도가 중요 할 때, 어떻게하면 두 세계의 장점을 얻을 수 있습니까? 필자는 함수 호출로 인해 필요한 오버 헤드없이 매우 분해 된 프로그램을 원합니다. 필자는 "인라인"이라는 키워드에 익숙하지만 컴파일러에 대한 제안 일 뿐이며 프로그래머가 잘못 사용하면 더욱 느린 프로그램이 생성됩니다. g ++을 사용하고 있으므로 -03 플래그를 사용하면 함수를 호출하는 함수를 호출하는 함수를 최적화 할 수 있습니다. 내 관심사가 유효하고이 문제를 해결할 수있는 방법이 있는지 알고 싶었습니다.함수 피하기로 프로그램 속도 향상? (C++)

+0

가능 중복 된 [I 리눅스에서 C++ 코드를 프로파일하려면 어떻게 사용할 수 있습니까?] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in- linux) –

+2

일반적으로 걱정하지 마십시오. 좋은 컴파일러는 inline 키워드를 사용하지 않아도 가능할 때마다 인라인 될 것입니다. –

+6

귀하의 우려 사항은 ** 유효하지 않습니다 **. (1) 어떻게 든 나는 당신이 그 상황에 있다는 것을 믿지 않는다. (2) 사람들은 추측과 소문에 의해 그렇게 멀리 가지 않는다. – delnan

답변

3

첫째, 항상 성능 문제를 처리 할 때, 당신은 시도하고 병목 현상이 프로파일로 무엇을 측정해야한다. 가장 먼저 나오는 것은 함수 호출이 아니라 큰 차이입니다. 당신이 이것을했다면, 계속 읽어주세요.

그런 다음, 당신은 당신이 inline 키워드를 사용하여 인라인 원하는 기능 어떤 비트를 예상 할 수 있습니다. 컴파일러는 보통 인라인 할 대상과 인라인하지 않는 대상을 알기에 충분히 똑똑합니다 (잊어 버린 함수를 인라인 할 수 있고 도움이되지 않는다고 생각하면 주석을 달지 않은 인라인을 만들 수 있음).

함수 호출의 성능을 향상시키고 인라이닝을 강제 수행하려는 경우 일부 컴파일러에서이 작업을 수행 할 수 있습니다 (question 참조). 방대한 인라인은 실제로 성능을 저하시킬 수 있습니다. 코드가 많은 메모리를 사용하게되고 코드에서 이전보다 캐시 미스가 많을 수 있습니다 (좋지 않음).

-1

속도가 의심 스럽지만 내 제안은 전 처리기 매크로를 사용하는 것입니다. 예를

#define max(a,b) (a > b ? a : b) 

를 들어

이 나에게 분명한 것 같다, 그러나 나는 나 자신이 C++에 기대 생각하지 않는다, 그래서 나는 질문을 오해 할 수있다.

+4

(1) 매크로는 C++에서 관용적이지 않습니다. 템플릿은 모든면에서 효율적이며, 유효 범위가 넓으며, 유효 범위를 존중합니다. (2) 다른 답변 (여기 및 다른 곳)에서 설명한 것처럼 많은 양의 인라인을하면 성능을 향상시킬 수 있습니다. – delnan

1

코드의 특정 부분 인 경우 걱정할 시간입니다. 시간을 직접 측정 할 수 있습니다. 루프를 여러 번 실행하고 전후로 시스템 시간을 가져옵니다. 차이를 사용하여 각 통화의 평균 시간을 찾습니다.

숫자는 사용자 시스템과 컴파일러에 따라 달라질 수 있으므로 항상 주관적입니다. 다른 방법에서 얻은 시간을 비교하여 매크로를 사용하여 함수를 대체하는 것과 같이 일반적으로 더 빠른 것을 확인할 수 있습니다. 제 추측으로는 많은 차이를 느끼지 못할 것입니다. 또는 적어도 그것은 중요하지 않을 것입니다.

둔화가 J.N의 조언을 따라 코드 프로파일 러를 사용하고이 필요한 곳에 최적화 어디 있는지 모르는 경우

. 엄지의 법칙은 복사 나 복사를 피하기 위해 큰 객체를 참조 또는 const 참조로 함수에 전달합니다. 의