Domanda

Dopo tre anni di lavoro su un progetto C ++, l'eseguibile è cresciuta fino a 4 MB. Mi piacerebbe vedere dove tutto questo spazio sta andando. Esiste uno strumento che potrebbe riferire ciò che i più grandi maiali spaziali sono? Sarebbe bello vedere la dimensione per classe (tutte le funzioni in una classe), da modello (tutte le istanze), e dalla libreria (quanto appartiene alla libreria standard C e STL? Quanto per ogni libreria in exe?)

Modifica: Nota, io sto usando Visual C ++ su Windows

.
È stato utile?

Soluzione

In Linux , è possibile utilizzare nm visualizzare tutti i simboli nel eseguibile e di ordinarli in ordine inverso per dimensione:

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

Opzioni:

  • -C demangles nomi C ++.
  • -S mostra le dimensioni di simboli.
  • --size-sort ordina i simboli in base alle dimensioni.
  • -r inverte il genere.

Se si desidera ottenere i risultati per namespace o per classe, si può semplicemente grep l'uscita per 'namespace::', 'namespace::class_name::', ecc. .

Se si desidera solo per vedere simboli che sono definiti in il file eseguibile (non quelli definiti altrove, come nelle biblioteche) quindi aggiungere --defined-only. Ricerca per dimensioni dovrebbero prendersi cura di questo, però, dal momento simboli non definiti non stanno per avere una dimensione.

Per Windows , si dovrebbe comunque essere in grado di utilizzare dumpbin sui vostri file binari, poiché /SYMBOLS supporti binari COFF . È possibile installare <=> via cygwin, o si potrebbe copiare le finestre eseguibili ad una macchina Linux ed eseguire <=> su di esso c'è.

Si potrebbe anche provare <=> , che discariche informazioni su un binario su Windows. È possibile ottenere informazioni sui simboli con l'interruttore <=>, ma non apparire come esso fornisce direttamente informazioni sulle loro dimensioni.

Altri suggerimenti

In Windows in Visual Studio compila, queste informazioni sono nel file .map (che sarà vicino al PDB).

AGGIUNTO : Per convertire i nomi decorati trovati nel file .map a qualcosa di più leggibile, è possibile utilizzare il utilità undname.exe incluso in Visual Studio. Accetta nomi individuali sulla riga di comando o si può alimentare un file MAP.

Ad esempio,

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

Undecoration of "?push_back@?$mini_vector@U?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@$05@@QAAXABU?$Point@U?$FixedPoint@$0O@H@Math@@@Math@@@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 &)"

non ho potuto ottenere nm a lavorare per me, ma sono riuscito a trovare un utile strumento chiamato Sizer . Si legge le informazioni di debug creato da Visual Studio utilizzando le librerie di debug interfaccia di accesso. E 'piuttosto semplice da usare, come descritto sul sito.

  1. compilare con informazioni di debug nel database del programma (PDB) file
  2. Esegui sizer da linea di comando per esempio Sizer.exe <path-to-exe-file>. L'uscita andrà a stdout per cui è probabile desidera reindirizzare a un file.

Le dimensioni del codice sono suddivise in diverse sezioni e raggruppati per funzione, dati, classe, ecc, ogni sezione ordinati in ordine di grandezza codice decrescente.

Non basta guardare il codice -. Le risorse possono facilmente causare la crescita multi-megabyte

Ottenere una mappa di collegamento, o utilizzare dumpbin per ottenere un elenco di simboli e dimensioni.

È probabile che ci sia un sacco di roba essere tirato nel senso che non sono strettamente necessarie.

AGGIUNTO: Hai ricevuto una risposta soddisfacente? Mi sono reso conto ci sono due modi le persone si avvicinano a problemi come questo:

  • Ottenere misurazioni prima di fare qualsiasi cosa.
  • Basta trovare qualcosa di grande che non hanno bisogno, strappare fuori, e ripetere fino a che non possono.

Personalmente preferisco la seconda -. Ottiene risultati più rapidi

Tu dici che l'applicazione è 4MB. Supponiamo che la vera dimensione necessaria è 1MB (o qualche tale dimensione). Ciò significa che se si sceglie una routine a caso dal file di mappa, è probabile il 75% di essere qualcosa che non è necessario. Scoprire che cosa sta causando da inserire, e vedere se si ha realmente bisogno.

Nel esempio che ha dato, hai visto una classe che avvolge indipendenti dal dispositivo-bitmap. Si potrebbe trovare istanze di quella classe nella vostra app, ed eventualmente sostituirli con le bitmap Win32 di base. Sarebbe meno bella, ma salvare sputi di dimensioni app.

Poi continuare a farlo. Ogni pezzo grande a sbarazzarsi di rende i pezzi rimanenti prendono una percentuale maggiore di app, in quanto l'applicazione si è ridotto, ma i pezzi non hanno. Che li rende più facili da trovare nel file di mappa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top