Frage

Ich laufe in der folgenden Ausgabe, während eine Anwendung unter VC6 Profilierung. Als ich das Anwendungsprofil, das anzeigt, der Profiler, dass eine einfache Getter-Methode ähnlich der folgenden wird viele Hunderttausende Male aufgerufen werden:

int SomeClass::getId() const
{
   return m_iId;
};

Das Problem ist, diese Methode ist nicht überall in dem Test-App namens . Wenn ich den Code der folgenden ändern:

int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

Der Profiler enthält nie getId in der Liste der aufgerufenen Funktionen. Kommentieren Sie die cout und ich bin gleich zurück, wo ich begann, 130+ tausend Anrufe! Nur um sicherzustellen, dass es nicht einige gecached Profiler Daten oder beschädigte Funktion Lookup-Tabelle, ich bin ein sauber tun, und zwischen jedem Test neu zu erstellen. Noch die gleichen Ergebnisse!

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ich denke, würde das, was passiert, ist, dass der Compiler und / oder der Linker ‚Koaleszenz‘ diese sehr einfache Funktion auf eine oder mehrere andere Funktionen, die identisch sind (die für return m_iId generierte Code ist wahrscheinlich genau das gleiche wie viele andere Getter, die ein Mitglied zurück passieren, die auf dem gleichen Offset) ist.

im Wesentlichen, eine Reihe von verschiedenen Funktionen, die identischen Maschinencode-Implementierungen haben zufällig alle auf die gleiche Adresse aufgelöst werden, verwirrende die Profiler.

Unter Umständen können Sie dies stoppen geschieht (wenn dies das Problem) durch off-Optimierungen drehen.

Andere Tipps

Ich nehme an, Sie ein Profil erstellen, weil Sie wollen herausfinden, ob es Möglichkeiten gibt, das Programm weniger Zeit zu machen, nicht wahr? Sie sind nicht nur Profilierungs weil Sie Zahlen sehen.

Es gibt einen einfachen, altmodisch, erprobte und wahre Weg, um Performance-Probleme zu finden. Während das Programm läuft, drücken Sie einfach die Schaltfläche „Pause“ und Blick auf den Call-Stack. Tun Sie dies mehrmals, wie von 5 bis 20 mal. Je größer ein Problem ist, desto weniger Proben Sie brauchen, um es zu finden.

fragen Einige Leute, wenn dies nicht im Grunde ist das, was Profilometer tun, und die Antwort ist nur sehr wenige. meisten Profilometer fallen für einen oder mehrere gemeinsame Mythen , mit dem Ergebnis, dass Ihr Speedup begrenzt weil sie nicht finden, alle Probleme:

  • Einige Programme sind die Ausgaben unnötig Zeit in "Hotspots". Wenn das der Fall ist, werden Sie sehen, dass der Code am „Ende“ des Stapels (wo der Programmzähler) unnötige Arbeit tut.

  • Einige Programme machen mehr I / O als nötig. Wenn ja, werden Sie sehen, dass sie im Begriff sind, zu tun, dass I / O.

  • Große Programme sind oft langsam, weil ihr Ruf Bäume unnötig buschig sind, und brauchen Beschneidung. Wenn ja, werden Sie die unnötigen Funktionsaufrufe Mittelstapel sehen.

Jeder Code, den Sie auf einem gewissen Prozentsatz von Stapeln sehen werden, wenn sie entfernt werden, außer diesem Prozentsatz der Ausführungszeit (mehr oder weniger). Sie können nichts falsch machen. Hier ist ein Beispiel , über mehrere Iterationen des Sparens über 97 %.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top