절차 적 프로그래밍과 관련하여 기능적 분해는 복잡한 코드를 유지 관리하는 데 이상적입니다. 그러나 함수는 호출 스택에 추가하고 매개 변수를 전달하며 반환 주소를 저장하는 데 비용이 많이 듭니다. 이 모든 것은 여분의 시간이 필요합니다! 속도가 중요 할 때, 어떻게하면 두 세계의 장점을 얻을 수 있습니까? 필자는 함수 호출로 인해 필요한 오버 헤드없이 매우 분해 된 프로그램을 원합니다. 필자는 "인라인"이라는 키워드에 익숙하지만 컴파일러에 대한 제안 일 뿐이며 프로그래머가 잘못 사용하면 더욱 느린 프로그램이 생성됩니다. g ++을 사용하고 있으므로 -03 플래그를 사용하면 함수를 호출하는 함수를 호출하는 함수를 최적화 할 수 있습니다. 내 관심사가 유효하고이 문제를 해결할 수있는 방법이 있는지 알고 싶었습니다.함수 피하기로 프로그램 속도 향상? (C++)
답변
첫째, 항상 성능 문제를 처리 할 때, 당신은 시도하고 병목 현상이 프로파일로 무엇을 측정해야한다. 가장 먼저 나오는 것은 함수 호출이 아니라 큰 차이입니다. 당신이 이것을했다면, 계속 읽어주세요.
그런 다음, 당신은 당신이 inline
키워드를 사용하여 인라인 원하는 기능 어떤 비트를 예상 할 수 있습니다. 컴파일러는 보통 인라인 할 대상과 인라인하지 않는 대상을 알기에 충분히 똑똑합니다 (잊어 버린 함수를 인라인 할 수 있고 도움이되지 않는다고 생각하면 주석을 달지 않은 인라인을 만들 수 있음).
함수 호출의 성능을 향상시키고 인라이닝을 강제 수행하려는 경우 일부 컴파일러에서이 작업을 수행 할 수 있습니다 (question 참조). 방대한 인라인은 실제로 성능을 저하시킬 수 있습니다. 코드가 많은 메모리를 사용하게되고 코드에서 이전보다 캐시 미스가 많을 수 있습니다 (좋지 않음).
속도가 의심 스럽지만 내 제안은 전 처리기 매크로를 사용하는 것입니다. 예를
#define max(a,b) (a > b ? a : b)
를 들어
이 나에게 분명한 것 같다, 그러나 나는 나 자신이 C++에 기대 생각하지 않는다, 그래서 나는 질문을 오해 할 수있다.
(1) 매크로는 C++에서 관용적이지 않습니다. 템플릿은 모든면에서 효율적이며, 유효 범위가 넓으며, 유효 범위를 존중합니다. (2) 다른 답변 (여기 및 다른 곳)에서 설명한 것처럼 많은 양의 인라인을하면 성능을 향상시킬 수 있습니다. – delnan
코드의 특정 부분 인 경우 걱정할 시간입니다. 시간을 직접 측정 할 수 있습니다. 루프를 여러 번 실행하고 전후로 시스템 시간을 가져옵니다. 차이를 사용하여 각 통화의 평균 시간을 찾습니다.
숫자는 사용자 시스템과 컴파일러에 따라 달라질 수 있으므로 항상 주관적입니다. 다른 방법에서 얻은 시간을 비교하여 매크로를 사용하여 함수를 대체하는 것과 같이 일반적으로 더 빠른 것을 확인할 수 있습니다. 제 추측으로는 많은 차이를 느끼지 못할 것입니다. 또는 적어도 그것은 중요하지 않을 것입니다.
둔화가 J.N의 조언을 따라 코드 프로파일 러를 사용하고이 필요한 곳에 최적화 어디 있는지 모르는 경우
. 엄지의 법칙은 복사 나 복사를 피하기 위해 큰 객체를 참조 또는 const 참조로 함수에 전달합니다. 의- 1. PathGeometry.Combine (C# .net) 속도 향상?
- 2. 많은 SQL 호출로 느린 함수 속도 향상
- 3. 웹 서비스 속도 향상
- 4. 여러 스레드로 웹 응용 프로그램 속도 향상
- 5. Thread.Priority를 변경하여 프로그램 응답 속도 향상
- 6. 파일 쓰기 속도 향상
- 7. 이미지 처리 속도 향상
- 8. 레일에서 쿼리 속도 향상
- 9. django 서버 속도 향상
- 10. Matlab에서 C++ 로의 변환 속도 향상
- 11. 컨트롤의 활성화/비활성화 속도 향상 (C# WinForms)
- 12. Objective C 애니메이션/오브젝트 생성 속도 향상
- 13. 비 블로킹 유닉스 소켓 속도 향상 (C++)
- 14. 데이터베이스 쓰기 속도 향상
- 15. PHP의 속도 향상
- 16. iPad에서 CSS3 속도 향상
- 17. Android 에뮬레이터의 속도 향상
- 18. ksh에서 에코 속도 향상
- 19. mysql에서 작업 속도 향상
- 20. sqlFetch() 속도 향상
- 21. json 로딩 속도 향상
- 22. 속도 향상 변환 POSIX.ct하는
- 23. 메이븐 클린 속도 향상
- 24. 데이터베이스 속도 향상
- 25. MIPS 속도 향상 계산
- 26. xmlrpclib의 속도 향상
- 27. GTK 트리보기 속도 향상
- 28. 쿼리 속도 향상 방법
- 29. 내 스크립트의 속도 향상
- 30. MVC 렌더링 속도 향상
가능 중복 된 [I 리눅스에서 C++ 코드를 프로파일하려면 어떻게 사용할 수 있습니까?] (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in- linux) –
일반적으로 걱정하지 마십시오. 좋은 컴파일러는 inline 키워드를 사용하지 않아도 가능할 때마다 인라인 될 것입니다. –
귀하의 우려 사항은 ** 유효하지 않습니다 **. (1) 어떻게 든 나는 당신이 그 상황에 있다는 것을 믿지 않는다. (2) 사람들은 추측과 소문에 의해 그렇게 멀리 가지 않는다. – delnan