최적화 관련 문의

프로그래밍 일반에 관한 포럼입니다.

운영자: 류광

Locked
비회원

최적화 관련 문의

전체글 글쓴이: 비회원 » 2009-11-21 10:25

일단 제가 테스트한건 아니고, 사실 저는 이런것까지 최적화 할 필요는 없다고 생각하지만,
상황이 신기해서 질문드려봅니다.

1. 멤버 함수 구현을 header 파일에 넣는것과 cpp 에 넣는것.
일반적으로는 header 파일에 넣는 것이 더 빠르거나(인라인이 되서), 차이가 없어야 하는 걸로 알고 있는데요.(인라인이 안되서)
테스트 결과로는 뒤죽 박죽이라고 합니다.
즉, 어떤 부분에는 header 에 넣는게 빠르고, 어떤 부분에서는 cpp 에 넣는게 빠르다고 합니다.

2. 멤버 변수 초기화를 생성자의 initializer 에 넣는것과 대입하는 것
( : m_TestValiable(0) vs m_TestValiable = 0 )
당연히 m_TestValiable(0) 이것이 모두 빠르거나(최적화가 안 될 경우) 차이가 없어야 될텐데(최적화 될 경우),
이것도 뒤죽박죽이라고 합니다.
제 생각엔 다른 코드의 영향을 받는게 아닌가 싶은데, 일단은 이 결과만으로는 믿기 힘든 결과가 나오네요.

왜 이런 현상이 나오는지.... 원인을 찾으려면 어떤 방법을 사용해보면 좋은지 답변 부탁드립니다.

chadr
전체글: 980
가입일: 2003-06-01 12:28
사는 곳: 모대학
연락처:

전체글 글쓴이: chadr » 2009-11-21 11:12

확실하게 테스트 하기위해서는 프로파일러를 사용해야합니다.
단순히 함수 앞뒤로 시간체크 하는 식으로 하면 함수가 실행될때 컨텍스트 스위칭이 발생하는 경우 스위칭 시간과 해당 프로세스가 다시 실행되기 전까지 시간을 소모하게 됩니다.

프로파일러를 사용하면 이런것을 다 제외하고 순수하게 함수가 소모한 CPU시간을 측정 할 수 있습니다.

비회원

전체글 글쓴이: 비회원 » 2009-11-21 11:26

컴파일러 마다 사정은 다릅니다만,

1. 별 상관없습니다. C++ 명세에 inline키워드가 있다고
이걸 써서 소스를 작성했다고 인라인되는게 아니라는 건
잘 알고 있으실겁니다. 정말로 inline으로 함수를 만들던
implementation으로 함수를 만들던 컴파일러에 전역 최적화
기능이 있으면 알아서 인라인화 하는겁니다.
사용자가 vc의 __forceinline이나 macro 인라인으로 강제로
인라인을 하지 않으면 나머지는 컴파일러가 알아서 하는겁니다.
case by case로 어떤 경우가 인라인 되는지는 컴파일러
매뉴얼에도 적극적으로 설명되지 않은 경우가 많기 때문에
알 수는 없는 거구요. 개발 회사나 집단에 따라 코드 작성
방침이 있겠지만, 제가 볼때는 함수의 inline은 property정도나
templete 작성을 위해서만 사용하고 나머지는 그냥 구현하는게
재컴파일의 경우의 수를 감소시키고 컴파일 속도도 빠릅니다.
또한 어떠한 디버거든 코드화 하는게 디버깅시 정확한 위치를
추적해 주기도 하구요. 컴파일러를 믿으세요. 정녕 못 믿겠으면
그냥 매크로나 강제 인라인 기능, 또는 그냥 함수내에 구현
하시구요. 참고로 vc++를 사용하고 msdn회원이면 기술정보
질의로 물어볼 수 있습니다. (해봤는데 msdn 라이브러리 내용
보다 더 답변이 별로...)

2. 생성자에서 0을 대입하는 케이스는 특별히 사용자 클래스가
아니라면 대부분 정수형 또는 포인터형일 겁니다만.
그럴 경우는 생성자 초기화로 하던, 생성자 코드에서 대입을
하던 전혀 상관이 없습니다. 생성자의 초기화 목록이라고 해서
해당 멤버의 초기화를 하는 생성자나 대입 연산자가 정말
서로 다르거나 상호간에 특별한 코드를 수행을 하지 않는한은
컴파일러 최적화 기능은 알아서 잘 처리할겁니다.
음... 이런 비슷한 질의를 이펙티브C++에서 본것도 같네요.
하튼 다른 코드의 영향이라기보단 멤버의 원클래스의 구현 방식에
따라 발생하는 현상이라고 할 수 있을까요.

생성자를 못 믿겠으면, 기본 생성자로 기본 초기화만 하시고
별도의 초기화 함수를 만들어 사용하세요. 뭐랄까 C++이지만
C스타일로 사용한다고나 할까요. 멤버 함수가 있는 structure 정도?
물론 이럴 경우에는 멤버로 stl같은 초기화와 대입 연산자가 상당히
다르고 복잡한 경우가 있는 애가 있으면 절망이지만요.

그럼 전 인제 퇴근하러... 토요일인줄 모르고 출근을...!!

Locked