2012-04-09 13 views
2

Ich bin auf der Suche nach ein paar Tools zu profilieren, wo die Zeit verbracht wird. Habe oprofile angeschaut, aber das gibt mir wirklich nicht, was ich brauche.Profil Zeit verbrachte

Ich sah Callgrind, insbesondere mit den Makros CALLGRIND_START_INSTRUMENTATION und CALLGRIND_STOP_INSTRUMENTATION. Ich möchte nicht, dass das Tool die App zu sehr verlangsamt, wie es Valgrind im Allgemeinen tut. Aber das funktioniert nicht wirklich, weil Valgrind alles zu einem einzigen Thread zusammenzufassen scheint.

Zum Beispiel, wenn fn A ruft fb B, die fn C anruft, und zurück zu B und A, möchte ich wissen, wie viel Zeit wo verbracht wurde. Ich habe einige Mutex-Tools, die ich verwende, aber ein gutes Zeit-Tool wäre sehr nützlich, um zu sehen, wo genau die Zeit verbracht wird, damit ich mich auf diese Pfade konzentrieren kann. Kann ich nichts hinzufügen, gibt es ein Werkzeug, das ich für diese Aufgabe verwenden kann? Es ist eine C++ App btw. Ich kann Valgrind wegen seiner Singlethread-Ness im Kernel nicht verwenden. Auch meine App verbringt eine Menge Zeit zu warten, so dass einfache CPU-Profiler nicht wirklich helfen.

+0

scheint wie eine Frage, die schon mehrfach beantwortet worden wäre ... –

+0

Ich habe versucht, etwas zu finden, konnte aber nicht. Vielleicht benutzte ich schlechte Suchbegriffe :) Ich sah ein paar Verweise auf Callgrind und Valgrind, aber nicht viel darüber hinaus. Kannst du mir nur in die richtige Richtung zeigen? Oder wenn Sie einige Werkzeuge haben, die Sie vorschlagen können, wäre das großartig! –

+0

Die meisten davon ist Callgrind, die ich nicht verwenden kann, weil es einzelne Threads der gesamten App :(Ich sehe nichts anderes in meinem Abschnitt Verwandte .. –

Antwort

0

Sie könnten sich interessieren, einen Blick auf Punkt 3 von this post zu werfen.

Es schlägt vor, nicht zu fragen, wo die Zeit verbracht wird, aber warum. Es gibt einen qualitativen Unterschied zwischen der Annahme, dass Sie nach einer Methode suchen, die "zu viel Zeit" im Vergleich zum Bitten (durch Studieren von Stapelproben, nicht Zusammenfassen), was das Programm tatsächlich versucht, bei einer kleinen Stichprobe zu erreichen Zeitpunkte.

Dieser Ansatz findet alles, was Sie durch Messmethoden und vieles mehr finden können. Wenn wiederholt angewendet, kann dies zu großen Beschleunigungsfaktoren führen.

In einer Multithread-Situation können Sie Threads identifizieren, die nicht inaktiv sind, und sie auf sie anwenden.

+1

Danke für die Antwort Mike. Ich werde auf jeden Fall zum "Warum" kommen, aber zu zu ihnen, warum, ich muss herausfinden, "wo". Die Anwendung ist eine massive Multithread-App, mit vielen Dingen zur gleichen Zeit. Ich habe wirklich gehofft, dass dies ein Problem ist groß genug, dass ein Werkzeug dies messen kann Anstatt einen regelmäßigen Snapshot zu machen, hilft mir auch ein Snapshot nicht, was ich verstehen kann, denn die Threads verbringen eine Menge Zeit zu schlafen und werden nicht oft auf dem Stack angezeigt, da dieses Programm überhaupt nicht an die CPU gebunden ist. Ist das richtig? –

+0

@Mark: Du bist in guter Gesellschaft, denkst darüber nach, aber Hier ist das Ding. Wenn eine Multithread-Anwendung langsam ist, liegt es daran, dass ein oder mehrere Threads zu viel Zeit (einen guten Bruchteil X) damit verbringen, etwas Y zu tun. Wenn Sie also eine Momentaufnahme machen, schauen Sie sich die Threads an, die oder b) Warten auf E/A, die sie angefordert haben. Die Wahrscheinlichkeit, dass du es sehen wirst, ist X, also wenn du das 10 Mal tust, wirst du sehen, dass es 10x-mal im Durchschnitt Y macht. Was Messen nicht sagt, ist was Y ist, und nur eine High-Time-Funktion zu sehen, sagt Ihnen auch nicht. –