2012-07-30 10 views
5

unser Projekt ist wirklich groß. Die Quellcode-Größe beträgt etwa 620KLOC in einem Modul. Also ich möchte überprüfen, welche Funktion in einem Verzeichnis/Modul die größte ist? Gibt es ein Tool, das es unterstützen kann?Welches Tool kann die maximalen Anweisungen der Methode oder Funktion in C++ anzeigen?

SourceMonitor hat nur "Average Statements per Method", nicht maximale Anweisungen pro Methode. CCCC unterstützt es auch nicht.

Beispiel. Diese Funktionslänge ist 1.

unsigned short get() 
{ 
    return 1; 
} 

Danke.

+0

Ich bezweifle, ob dies mit aktuellen Tools möglich ist. – iammilind

+0

Clang bietet eine übersichtliche Infrastruktur zum Schreiben verschiedener Quellenwerkzeuge. Sie können damit ein eigenes Werkzeug entwickeln. – arrowd

+0

es würde variieren, wenn Sie Optimierungen verwenden – Zaffy

Antwort

2

Die einfachste Sache, die ich mir vorstellen kann, ist Scripting Ihren Weg durch sie.

  • Benutzen Sie zB ctags, um eine Liste von Funktionen in der Datei zu erhalten
  • Verwenden Perl/Python/awk/grep Quelldatei in separate Dateien aufteilen, eine Datei pro Funktion
  • einfach die Linien zählen von jeder Datei nehmen Sie die maximale Länge. Wenn Sie weitere Details benötigen, geben Sie jede Datei in einen Loc-Counter ein, z. sloccount zu
    erhalten raffiniertere Informationen. Verwenden Sie grep wieder zu bekommen die Ausgabe Sie sind interessiert in

Ein weiteres Tool, das hilfreich sein könnte:

Faule C++: Ist ein Code-Generator, Dateien aufteilt, die sehr ähnlich sind, C++ in Kopf- und Quelle. Wenn Sie Ihren Code in eine lzz-Datei umwandeln, enthält der generierte Code Zeilenzähler-Tags pro Funktion. Die Unterschiede in diesen Zahlen würden Ihnen zeigen, wie groß Ihre Funktionen sind

+1

anstatt in verschiedene Dateien zu teilen, würde ich empfehlen, Ctags mit -x zu verwenden, die in der menschenlesbaren Ausgabezeilennummer angegeben sind. sortieren nach ihnen, und seine leicht, die Linien zu berechnen (diese Zahl nur ca., sollte aber genug sein, die größte zu finden) pro Funktion – flolo

+0

ich ctags nicht vor dem Gebrauch. Ich werde das vorstellen und versuchen, es zu verstehen. – liuzw

+0

ctage Nähte wirklich mächtig. Flolo und Martin, kennst du es? Kannst du die Befehle geben, um meine Anforderungen zu unterstützen? Vielen Dank – liuzw

0

Ich denke, dass viele statische Analyse-Tools können Sie nicht geben, was Sie brauchen, da sie nicht unbedingt Dinge wie Template-Instanziierungen berücksichtigen, einschließlich Header durch vorkompilierte Header eingezogen) und die Code-Generierungseigenschaften des Compilers.

Ich hatte in der Vergangenheit ein ähnliches Problem mit einer großen ausführbaren Datei, deren Größe von einer bestimmten Bibliothek dominiert wurde. Die Art und Weise, wie ich auf den Grund kam, war einfach die Größe der Objektdateien für jede .cpp zu betrachten. Das wird Ihnen nicht die ganze Geschichte geben, da der Linker ungenutzte Teile optimieren wird (obwohl es sich lohnt zu überprüfen, dass Sie diese Option gesetzt haben - /OPT:REF für Visual Studio). Es erlaubt Ihnen jedoch, Ihre Suche zu fokussieren. Suchen Sie die zwei oder drei größten Objektdateien und sehen Sie sich dann die entsprechenden CPP-Dateien an. Sie haben dann zwei Optionen - schreiben Sie ein Skript, das die Ausgabe von objdump (VisualStudio) oder nm -C (gcc), wo Sie die Offsets der einzelnen Funktionen im Modul extrahieren können, so können Sie mit dem jeweils anderen differieren, um eine Idee zu bekommen der Größe jeder Funktion.

Oder die einfachste Methode ist nur, binäre Suche in der cpp-Datei zu verwenden. #ifdef den gesamten Code nach dem Ende der # enthält und kompilieren Sie es. Das wird Ihnen eine Vorstellung vom Overhead der Includes geben (wenn das selbst sehr groß ist, können Sie in die Header-Einfügungen bohren, um herauszufinden, welches am meisten beiträgt). Als nächstes deaktivieren Sie jede Hälfte des Codes mit #ifdef und finden Sie heraus, welche Hälfte größer ist. Mit dieser Methode können Sie schnell die Funktionen finden, die am meisten zur Größe der Bibliothek beitragen.

Im Fall der Bibliothek, die ich hatte, die das gleiche Problem hatte, wandte sich die Ursache eine sehr große Templat-Funktion heraus, die jedes Mal, wenn ein Mitglied Variable gespeichert wurde instanziiert wurde. Die Lösung bestand in diesem Fall darin, die Funktion so zu konkretisieren, dass der gesamte Code, der kein typspezifisches Verhalten erfordert, nur einmal instanziiert wird und die Template-Funktionen für die typspezifischen Bit-Bits lokalisiert werden.

+0

Statische Analyse-Tools ist genug für mich. Wir können Vorlagencodes ignorieren, da unsere Vorlagencodes klein sind. Einige unserer "normalen" C++ - Methoden sind mehr als 600 Codezeilen. Und ich glaube nicht, dass die Objektdateigröße die Methodencodeleitungen erhalten kann, außer dass eine Datei eine Methode hat. Aber das stimmt nicht für uns. – liuzw

0

CppDepend geben Sie diese Informationen, es basiert auf Clang und mit CQLinq können Sie Ihren Code anfordern, wie Sie wollen.

1

Sie können Ihr Projekt mit unserem Tool SourceMeter scannen, und für Ihre Bedürfnisse stellt es CSV-Dateien mit Funktionen/Methoden mit Metriken zur Verfügung (unter anderem Größenmesswerte, die Sie suchen) und auch das enthaltene Modul (zB Bibliothek, gemeinsames Objekt, ausführbar). Mit einem Tabelleneditor können Sie leicht die größten Funktionen/Methoden pro Modul finden.