Ich versuche mit Google Perf Tools zu beginnen, 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 Durchlauf gibt Ergebnisse:Was genau misst C++ - Profiling (google cpu perf tools)?
Total: 857 samples 357 41.7% 41.7% 357 41.7% _write$UNIX2003 134 15.6% 57.3% 134 15.6% _exp$fenv_access_off 109 12.7% 70.0% 276 32.2% scythe::dnorm 103 12.0% 82.0% 103 12.0% _log$fenv_access_off 58 6.8% 88.8% 58 6.8% scythe::const_matrix_forward_iterator::operator* 37 4.3% 93.1% 37 4.3% scythe::matrix_forward_iterator::operator* 15 1.8% 94.9% 47 5.5% std::transform 13 1.5% 96.4% 486 56.7% SliceStep::DoStep 10 1.2% 97.5% 10 1.2% 0x0002726c 5 0.6% 98.1% 5 0.6% 0x000271c7 5 0.6% 98.7% 5 0.6% _write$NOCANCEL$UNIX2003
Dies ist überraschend, da die gesamte Berechnung in SliceStep :: DoStep erfolgt. Das "_write $ UNIX2003" (wo kann ich herausfinden, was das ist?) Scheint vom Schreiben der Ausgabedatei zu stammen. Nun, was verwirrt mich ist, dass, wenn ich alle outfile << "text"
Aussagen auskommentieren und pprof ausführen, 95% ist in SliceStep::DoStep
und _write $ UNIX2003 geht weg. Allerdings beschleunigt sich meine Anwendung nicht, gemessen an der Gesamtzeit. Das Ganze beschleunigt weniger als 1 Prozent.
Was fehlt mir?
Hinzugefügt: Der pprof Ausgang ohne outfile <<
Aussagen ist:
Total: 790 samples 205 25.9% 25.9% 205 25.9% _exp$fenv_access_off 170 21.5% 47.5% 170 21.5% _log$fenv_access_off 162 20.5% 68.0% 437 55.3% scythe::dnorm 83 10.5% 78.5% 83 10.5% scythe::const_matrix_forward_iterator::operator* 70 8.9% 87.3% 70 8.9% scythe::matrix_forward_iterator::operator* 28 3.5% 90.9% 78 9.9% std::transform 26 3.3% 94.2% 26 3.3% 0x00027262 12 1.5% 95.7% 12 1.5% _write$NOCANCEL$UNIX2003 11 1.4% 97.1% 764 96.7% SliceStep::DoStep 9 1.1% 98.2% 9 1.1% 0x00027253 6 0.8% 99.0% 6 0.8% 0x000274a6
Das sieht aus wie, was ich erwarten würde, es sei denn ich sehe keine sichtbare Zunahme der Leistung (0,1 Sekunden auf 10 Sekunden Berechnung) . Der Code ist im Wesentlichen:
Update: Ich Timing mit boost :: timer, beginnend wo der Profiler beginnt und endet wo es endet. Ich verwende keine Threads oder irgendetwas Besonderes.
Wie messen Sie die Laufzeit? Führen Sie für beide Konfigurationen ein "time ./yourprogramm" durch. Verwenden Sie Multithreading? – ebo
Machen Sie einen Lauf mit der Zeit und messen Sie die Systemzeit. Die Profiler-Nummern geben an, dass Sie 40% weniger Laufzeit ohne Ausgabe haben sollten. Die einfachste Erklärung wäre, dass die Profilermessung verzerrt ist. – ebo
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? – Tristan