Was genau misst C ++ - Profiling (google cpu perf tools)?

8

Ich versuche mit Google Perf Tools anzufangen, um einige CPU-intensive Anwendungen zu profilieren. Es ist eine statistische Berechnung, die jeden Schritt mit 'Ofstream' in eine Datei ablegt. Ich bin kein C ++ - Experte, deshalb habe ich Probleme, den Engpass zu finden. Mein erster Durchgang gibt Ergebnisse:

%Vor%

Das ist überraschend, da die gesamte Berechnung in SliceStep :: DoStep erfolgt. Die "_write $ UNIX2003" (wo kann ich herausfinden, was das ist?) Scheint vom Schreiben der Ausgabedatei zu kommen. Nun, was mich verwirrt ist, dass, wenn ich alle outfile << "text" -Anweisungen auskommentiere und pprof ausführe, 95% in SliceStep::DoStep und '_write $ UNIX2003' weggehen. Allerdings beschleunigt sich meine Anwendung nicht, gemessen an der Gesamtzeit. Das Ganze beschleunigt weniger als 1 Prozent.

Was vermisse ich?

Hinzugefügt: Die pprof-Ausgabe ohne die outfile << -Anweisungen lautet:

%Vor%

Das sieht so aus, wie ich es erwarten würde, außer dass ich keine sichtbare Leistungssteigerung sehe (0,1 Sekunde bei einer 10 Sekunden Berechnung). Der Code ist im Wesentlichen:

%Vor%

Update: Ich Timing mit boost :: timer, beginnt wo der Profiler beginnt und endet wo es endet. Ich benutze keine Threads oder irgendetwas Besonderes.

    
Tristan 16.06.2009, 18:52
quelle

3 Antworten

3

Aus meinen Kommentaren:

Die Zahlen, die Sie von Ihrem Profiler erhalten, sagen, dass das Programm ohne die print-Anweisungen um 40% schneller sein sollte.

Die Laufzeit bleibt jedoch nahezu gleich.

Offensichtlich muss eine der Messungen falsch sein. Das bedeutet, dass Sie mehr und bessere Messungen durchführen müssen.

Zuerst schlage ich vor, mit einem anderen einfachen Werkzeug zu beginnen: dem Zeitbefehl. Dies sollte Ihnen eine grobe Vorstellung davon geben, wo Ihre Zeit verbracht wird.

Wenn die Ergebnisse noch nicht schlüssig sind, brauchen Sie einen besseren Testfall:

  • Verwenden Sie ein größeres Problem
  • Machen Sie vor dem Messen eine Aufwärmphase. Führen Sie einige Schleifen aus und starten Sie danach (im selben Prozess) eine Messung.
  

Tiristan: Es ist alles in Benutzer. Was ich mache, ist ziemlich einfach, denke ich ... Bedeutet die Tatsache, dass die Datei die ganze Zeit offen ist irgendetwas?

Das bedeutet, dass der Profiler falsch ist.

Das Drucken von 100000 Zeilen mit Python auf die Konsole führt zu folgendem Ergebnis:

%Vor%

Zur Konsole:

%Vor%

Versus:

%Vor%

Mein Punkt ist: Ihre internen Messungen und Zeit zeigen, dass Sie durch die Deaktivierung der Ausgabe nichts erreichen. Google Perf Tools sagt, dass Sie sollten. Wer ist falsch?

    
ebo 16.06.2009, 20:06
quelle
1

_write $ UNIX2003 bezieht sich wahrscheinlich auf den Systemaufruf write POSIX, der an das Terminal ausgegeben wird. I / O ist sehr langsam im Vergleich zu fast allem anderen, also macht es Sinn, dass Ihr Programm viel Zeit dort verbringt, wenn Sie ein gutes Stück Output schreiben.

Ich bin nicht sicher, warum Ihr Programm nicht schneller wird, wenn Sie die Ausgabe entfernen, aber ich kann nicht wirklich nur die Informationen abschätzen, die Sie gegeben haben. Es wäre schön, einen Teil des Codes oder sogar die Ausgabe von perfmtools zu sehen, wenn die Anweisung cout entfernt wird.

    
Tyler McHenry 16.06.2009 19:04
quelle
1

Google pertools sammelt Samples des Aufruf-Stacks. Sie benötigen also einen Einblick in diese.

Gemäß dem Dokument können Sie das Aufrufdiagramm bei der Granularität von Anweisungen oder Adressen anzeigen. Das sollte dir sagen, was du wissen musst.

    
Mike Dunlavey 18.06.2009 18:14
quelle

Tags und Links