2009-06-26 2 views
12

3 년 동안 C++ 프로젝트를 수행 한 후 실행 파일은 4MB로 증가했습니다. 이 모든 공간이 어디로 가는지보고 싶습니다. 가장 큰 우주 혹이 무엇인지보고 할 수있는 도구가 있습니까? 클래스 (모든 클래스의 모든 함수), 템플릿 (모든 인스턴스화) 및 라이브러리 (C 표준 라이브러리 및 STL에 얼마나 많이 소속됩니까? EXE의 각 라이브러리에 대해 얼마만큼?)별로 크기를 확인하는 것이 좋습니다."함수 크기 프로파일 러"가 있습니까?

편집 : Windows에서 Visual C++를 사용 중입니다.

+0

누구나 궁금해하는 점은 1.8MB IIRC에서 4MB의 가장 큰 구성 요소 인 Flite (텍스트 음성 변환 엔진)가 제거 된 것으로 밝혀졌습니다. – Qwertie

답변

14

리눅스에서는 실행 파일에 모든 심볼을 표시 nm을 사용할 수 있으며 크기에 따라 역순으로 정렬 :

$ nm -CSr --size-sort <exe> 

옵션 :

  • -C demangles의 C++ 이름.
  • -S은 기호의 크기를 나타낸다.
  • --size-sort 크기별로 기호를 정렬합니다.
  • -r은 정렬을 취소합니다.

당신이 클래스 네임 스페이스 별 또는 결과를 얻고 싶다면는 할 수 있습니다 'namespace::', 'namespace::class_name::'단지 grep 출력, 합니다.

에 정의 된 기호 만에있는 경우 실행 파일 (예 : 라이브러리와 같이 다른 위치에 정의 된 파일)이 아닌 경우 --defined-only을 추가하십시오. 정의되지 않은 기호는 크기를 가지지 않으므로 크기별로 정렬하면 처리해야합니다. nmCOFF 바이너리를 지원하기 때문에

윈도우를 들어, 당신은 여전히 ​​당신의 바이너리 파일에 nm을 사용할 수 있어야합니다. cygwin을 통해 nm을 설치하거나 실행 가능한 Windows를 Linux 상자에 복사 한 다음 nm을 실행하면됩니다.

dumpbin도 시도 할 수 있는데, Windows에서는 이진 정보를 덤프합니다. /SYMBOLS 스위치를 사용하면 기호에 대한 정보를 얻을 수 있지만 크기에 대한 정보를 직접 제공하지는 않습니다.

+0

아, 리눅스의 경이. 바람막이에 너무 안좋아. – Qwertie

+0

cygwin에서 gcc로 컴파일 한 다음 nm 툴을 사용하여 aproximate 목록을 만들 수 있습니다. – Blindy

+1

내가 아는 한 nm은 COFF를 지원합니다. 당신은 cygwin을 통해 그것을 설치할 수 있습니다, 또는 당신은 리눅스 박스에 exe를 복사하고 거기에 nm을 실행할 수 있습니다. windows 유틸리티 dumpbin을 사용해 볼 수도 있습니다. 여기를 참조하십시오 : http://support.microsoft.com/?id=121460 – tgamblin

1

링크 맵을 얻거나 dumpbin을 사용하여 기호 및 크기 목록을 얻으십시오.

엄밀히 말하면 엄청나게 필요한 것들이 많이 있습니다.

ADDED : 만족스러운 답변을 얻었습니까? 나는 사람들이 다음과 같은 두 가지 방법으로 문제에 접근한다는 것을 깨달았다.

  • 무엇인가를하기 전에 측정을하십시오.
  • 그들이 필요로하지 않는 큰 것을 찾아서 뜯어 내고 반복 할 수 없을 때까지 반복하십시오.

개인적으로 나는 후자를 선호합니다. 결과가 더 빨리 나타납니다.

앱이 4MB라고합니다. 실제로 필요한 크기가 1MB (또는 일부 크기)라고 가정합니다. 즉,지도 파일에서 무작위로 루틴을 선택하면 75 %가 필요없는 것일 수 있습니다. 포함되는 원인을 찾아 내고 정말로 필요한지 확인하십시오.

예를 들어, 디바이스 독립적 비트 맵을 래핑하는 클래스를 보았습니다. 앱에서 해당 클래스의 인스턴스를 찾고 기본 WIN32 비트 맵으로 대체 할 수 있습니다. 그것은 덜 예쁘지 만, 애플 리케이션 크기의 깡통을 저장하십시오.

그런 다음 계속하십시오. 당신이 제거하는 각각의 커다란 조각은 앱이 수축했지만 조각들은 가지고 있지 않기 때문에 남아있는 조각들이 앱의 더 큰 부분을 차지하게 만듭니다. 이렇게하면지도 파일에서 더 쉽게 찾을 수 있습니다.

+0

DIB 래퍼의 예제를 다시 사용하면 그 클래스는 작을 수도 있고 추출하지 않고 저장할 수도 있습니다. OTOH, 벡터 ,지도 , hash_map 등의 다양한 인스턴스가있을 수 있으며 인스턴스를 공유하는 방법을 찾아 공간을 절약 할 수 있습니다. 하지만 다시 컴파일러는 똑같은 suproutine을 병합 할만큼 똑똑 할 수도 있고 (아마도 템플릿으로 자주 발생합니다), 아니면 그 클래스가 많은 경우에도 많은 공간을 차지하지 않을 수도 있습니다. 어쩌면 내가 좋은 데이터를 가지고 있다면 나는 쉽게 공간을 구할 수 없거나 공간이 예기치 않은 곳으로 가고 있다는 것을 알게 될 것이다. – Qwertie

+0

"정상적인"프로파일 러를 사용한 경험을 통해 리소스가 어디로 가고 있는지에 대한 내 직관이 종종 잘못되었다는 것을 알고 있습니다. 따라서 .map 파일을 시각적으로 검사하고 클래스/함수/라이브러리에서 많은 공간을 차지하는 것만으로는 충분하지 않습니다. – Qwertie

+0

@Qwertie : 당신이 의미하는 바를 알고 있습니다. 그러나 가난한 이유로 리소스가 많이 존재하고, 드문 드문 샘플링하고, 각 샘플의 원인을 결정하면 문제가 드러날 수 있습니다. 당신은 정확하게 측정하지만 약간의 통찰력을 제공하지 않습니다. 당신은 거칠게 측정하지만 최대 통찰력을주는 뭔가가 필요합니다. –

7

Visual Studio에서 Windows를 컴파일하면이 정보가 .map 파일 (.pdb 근처에 있음)에 있습니다. , 당신은 undname.exe 유틸리티 비주얼 스튜디오에 포함 사용할 수있는 더 많은 사람이 읽을 수있는 무언가에 .MAP 파일에 장식 된 이름을 변환하려면 :

을 추가했습니다. 명령 줄에서 개별 이름을 사용하거나 .map 파일을 제공 할 수 있습니다. 예를 들어

,

Microsoft (R) C++ Name Undecorator 
Copyright (C) Microsoft Corporation. All rights reserved. 

Undecoration of "[email protected][email protected][email protected][email protected][email protected]@[email protected]@@[email protected]@[email protected]@[email protected][email protected][email protected]@[email protected]@@[email protected]@@Z" is 

"public: void __cdecl mini_vector<struct Math::Point<struct Math::FixedPoint<14,int> >,6>::push_back(struct Math::Point<struct Math::FixedPoint<14,int> > const &)" 
+2

지도 파일을보고 있는데 "0001 : 0000f380? push_back @? $ mini_vector @ U? $ Point @ U? $ FixedPoint @ $ 0O @ H @ Math @@@ Math @@ $ 05 @@ QAAXABU? $ Point @ U? $ FixedPoint @ $ 0O @ H @ Math @@@ 수학 @@@ Z 10010380 fiibibmapsce : DIBitmap.obj "는 프로파일 링에 유용합니다. – Qwertie

+0

맹 글링 된 이름으로 연기하지 마십시오. 디바이스 독립적 인 비트 맵 지원에는 포인트 벡터의 끝 부분에 추가 기능이 있으며 세그먼트 1의 주소 F380 (62336)에 있습니다. 훨씬 더 좋아할 것입니다. 이것이 참조 된 곳을보고, 필요하지 않은 경우 제거 할 수 있는지 확인하십시오. –

+0

Visual Studio bin 디렉토리에있는 undname.exe로 이름을 꾸며 낼 수 있습니다. "Visual Studio 200X 명령 프롬프트"바로 가기를 실행하면 % PATH %에 저장됩니다. 또는 일괄 적으로 수행하려는 경우 자동으로 수행하는이 Python 스크립트를 발견했습니다. http://holycall.tistory.com/entry/A-Simple-Python-Wrapper-to-Undecorate-Visual-Studio-Linker- Symbol-Names – Crashworks

1

은 코드를 보지 마 - 자원은 쉽게 멀티 메가 바이트의 성장을 일으킬 수 있습니다.

+0

맞아 .- 비트 맵과 같은 거대한 수 있습니다. –

+0

다행히 비트 맵 크기는 측정하기 쉽습니다. 제 경우에는 문제가되지 않습니다. – Qwertie

2

나는 nm을 사용할 수 없지만 Sizer이라는 유용한 도구를 찾을 수있었습니다. 디버그 인터페이스 액세스 라이브러리를 사용하여 Visual Studio에서 만든 디버그 정보를 읽습니다. 사이트에서 설명하는 것처럼 사용하기가 쉽습니다. (.PDB)는 예를 들어, 명령 줄에서

  • 실행 사이 저 파일 프로그램 데이터베이스에 디버깅 정보와

    1. 컴파일 Sizer.exe <path-to-exe-file>. 출력은 표준 출력으로 바뀌므로 파일로 리디렉션하려고 할 것입니다.

    코드 크기는 여러 섹션으로 나뉘며 각 섹션은 코드 크기의 내림차순으로 정렬 된 함수, 데이터, 클래스 등으로 그룹화됩니다.

  • 관련 문제