Profiling-Programm nach Art der Aktivität

8

Die Ausgabe eines typischen Profilers ist eine Liste von Funktionen in Ihrem Code, sortiert nach der Zeit, die jede Funktion benötigt hat, während das Programm lief.

Das ist sehr gut, aber manchmal interessiert mich mehr, was das Programm am meisten macht, als mit wo war EIP die meiste Zeit.

Eine Beispielausgabe meines hypothetischen Profilers ist:

%Vor%

Gibt es einen solchen Profiler? Ist es möglich, eine solche Ausgabe von einem "Standard" Profiler abzuleiten?

Ich benutze Linux, aber ich bin froh, irgendwelche Lösungen für andere Systeme zu hören.

    
Elazar Leibovich 08.02.2011, 19:53
quelle

2 Antworten

1

Dies ist nur Solaris, aber dtrace kann fast jede Art von E / A, Ein- / Aus-CPU, Zeit in bestimmten Funktionen, Ruhezeit usw. überwachen. Ich bin nicht sicher, ob es Cache-Misses feststellen kann, vorausgesetzt Sie mittlerer CPU-Cache - ich bin mir nicht sicher, ob diese Informationen von der CPU zur Verfügung gestellt werden oder nicht.

    
Mark B 08.02.2011 20:15
quelle
1

Bitte schauen Sie hier und dies .

Betrachten Sie einen beliebigen Thread. Zu jedem Zeitpunkt tut es etwas, und es tut es aus einem bestimmten Grund, und Langsamkeit kann als die Zeit definiert werden, die es für schlechte Gründe verbringt - es muss nicht diese Zeit verbringen.

Machen Sie einen Schnappschuss des Threads zu einem bestimmten Zeitpunkt. Vielleicht ist es in einem Cache-Miss, in einer Anweisung, in einer Anweisung, in einer Funktion, aufgerufen von einer Aufrufanweisung in einer anderen Funktion, von einem anderen aufgerufen, und so weiter, bis zu call _main . Jeder dieser Schritte hat einen Grund, den eine Überprüfung des Codes zeigt.

  1. Wenn einer dieser Schritte kein guter Grund ist und vermieden werden kann, muss dieser Zeitpunkt nicht verbraucht werden.

Vielleicht kommt die Platte zu diesem Zeitpunkt zu einem bestimmten Sektor, so dass etwas Datenstreaming gestartet werden kann, so dass ein Puffer gefüllt werden kann, so dass eine Leseanweisung in einer Funktion erfüllt werden kann und diese Funktion von a aufgerufen wird Rufen Sie die Site in einer anderen Funktion an, und zwar von einer anderen und so weiter, bis zu call _main oder was auch immer am Anfang des Threads passiert.

  1. Wiederholen Sie den vorherigen Punkt 1.

Der Weg, Engpässe zu finden, besteht also darin, herauszufinden, wann der Code aus schlechten Gründen Zeit verbringt. Der beste Weg, das zu finden, besteht darin, Snapshots von seinem Zustand zu machen. Die EIP oder irgendein anderes kleines Stück des Staates wird es nicht tun, weil es Ihnen nicht sagen wird, warum .

Sehr wenige Profiler "verstanden". Diejenigen, die dies tun, sind die Wand-Uhrzeit-Stack-Sampler, die nach Codezeile (nicht nach Funktion) Prozent der aktiven Zeit (nicht Menge an Zeit, besonders nicht "self" oder "exclusive") melden "Zeit." Das ist Zoom , und es gibt andere.

Wenn man sich anschaut, wo die EIP hingeht, ist es so, als würde man auf einer Uhr mit nur einem Sekundenzeiger Zeit messen. Das Messen von Funktionen ist wie der Versuch, die Uhrzeit auf einer Uhr mit fehlenden Ziffern zu erkennen. Das Profilieren nur während der CPU-Zeit, nicht während der gesperrten Zeit, ist wie der Versuch, die Zeit auf einer Uhr zu bestimmen, die nach dem Zufallsprinzip für längere Zeit nicht mehr läuft. Sich um die Messgenauigkeit zu sorgen, ist wie der Versuch, die Mittagspause auf den zweiten zu beschränken.

Das ist kein mysteriöses Thema.

    
Mike Dunlavey 08.02.2011 20:46
quelle

Tags und Links