2010-04-06 15 views
6

In AQTime für Delphi rühmt es sich, sehr schnell zu sein, um zu den Krisenherden zu kommen, indem man Bereiche und Trigger etc. verwendet. Aber es scheint mir, dass besonders wenn Sie sehr viel Code in den zu profilierenden Bereichen haben, die Ausführung langsamer wird auch wenn das Profiling NICHT aktiviert ist.Warum AQTime die Ausführung verlangsamt, selbst wenn das Profiling nicht aktiviert ist, und kann etwas dafür getan werden?

Zum Beispiel, wenn ich eine bestimmte Routine spät im Programmablauf profilieren möchte, aber nicht weiß, was dort heißt, würde ich denken, diese Routine nur als Auslöser und den ursprünglichen Status für Threads als Aus, und wählen Sie dann "Vollständige Prüfung nach Routinen/Linien". Wenn ich dies jedoch tue, verlangsamt sich die Programmausführung bereits stark bevor die Triggerroutine jemals getroffen wurde.

Zum Beispiel, wenn der "Vorbereitungsfluss" ungefähr 5 Minuten ohne AQTime dauert, dann wenn ich ihn mit deaktivierter Profilierung laufen lasse, läuft er schon seit 30 Minuten und läuft immer noch, obwohl ich weiß, dass der Auslöser noch gar nicht ist erreicht.

Ich weiß, ich kann versuchen, dies zu umgehen, indem die Menge der Routinen/Linien profiliert reduziert, aber es ist nicht wirklich eine gute Lösung für mich, da ich alle Profile profilieren möchte, sobald ich den eigentlichen Auslöser Routine. Ein weiterer, oft besserer Workaround ist es, die Anwendung ohne AQTime zu starten und dann Attach to Process zu verwenden, nachdem der "Vorbereitungsfluss" beendet ist, aber das funktioniert nur, wenn die Ausführung in der GUI an der richtigen Stelle pausiert oder anderweitig zur Verfügung stellt ein geeigneter Zeitrahmen für das Anbringen. In allen Fällen ist dies nicht der Fall.

Irgendwelche Kommentare darüber, warum dies so ist, und gibt es noch etwas anderes zu tun, als nur den Code aus den Bereichen zu reduzieren oder später an den Prozess anzuhängen?

+0

Wenn Sie den Namen der Routine nicht wissen, ist es nicht sehr spezifisch, oder? –

+1

Haben Sie den Support von AutomatedQA um Hilfe gebeten? – Lucero

+0

Ich kenne die Routine, die den profilierten Prozess startet (ich füge das als Auslöser hinzu), aber die Routine selbst kann große Aufrufketten zu allen Bereichen der Anwendung machen (mehr oder weniger), also weiß ich nicht, welchen Code ich hinzufügen soll Bereiche. - Nein, ich habe AutomatedQA noch nicht gefragt, aber ich denke, ich kann mit den Workarounds beginnen, habe mich aber gefragt, ob jemand mehr Informationen hat. –

Antwort

4

AQTime ist ein Instrumentenprofiler. Zur Laufzeit umgibt sie im wesentlichen jede Methode (oder einer Zeile, je nachdem, wie Sie die Optionen konfiguriert haben), die Sie gewählt haben, mit seinen eigenen Code zu profilieren, etwas wie folgt aus:

begin 
    DoStuff(); 
end; 

... wird:

Es tut dies direkt in der ausführbaren Datei, anstatt durch Ändern der Quelle, aber der Effekt ist im Wesentlichen der gleiche. Wenn Profiling aktiv ist, gibt es einen beträchtlichen Overhead für diese Aufrufe, da sie ziemlich viel abfeuern und ein gutes Stück Information protokollieren.

Wenn die Profilerstellung inaktiv ist, gibt es weniger Aufwand, da sie nichts protokollieren. Es gibt jedoch immer noch einen gewissen Mehraufwand für den Methodenaufruf selbst, plus den try/finally-Block.

Ich weiß nicht, ob Sie etwas in AQTime tun können, um dies anders zu verbessern als weniger Profil. Sie können jedoch auch einen Sampling-Profiler verwenden, der weniger Aufwand für den Profiler selbst verursacht, aber möglicherweise Aufrufe von Routinen verpasst, die schnell ausgeführt werden.

+0

Danke, das habe ich auch angenommen. Es erscheint mir nur ein wenig überraschend, dass der Effekt selbst beim Profiling auf Routinerebene (nicht auf Zeilenebene) so groß sein kann. Aber ich schätze, selbst die try-finally-Blöcke und Extra-Methoden-Aufrufe, auch ohne echten Inhalt, addieren sich, wenn es viele davon gibt. –

5

Nun könnte man meinen kostenlosen Profiler natürlich :-)
http://code.google.com/p/asmprofiler/

versuchen es beide Instrumentierung hat und Probenahme Profilierung möglich. Es hat nicht die ganze Funktionalität von AQTime, aber zumindest ist es kostenlos (und sehr geringer Leistungsverlust, wenn Sie Profiling aufgehört haben).

+1

Sieht gut aus - ich werde das überprüfen ... Sieht nach einem guten Kandidaten für die Delphi-Partner-DVD aus. –

+0

Danke - ich könnte das auch ausprobieren. –

+0

Ich fühle AsmProfiler_Sampling v1.0.7.22 ist besser als AqTime im Bundle mit den neuesten Delphi-Editionen – VibeeshanRC

2

Also was meinst du mit "Vollprüfung durch Routinen/Linien". Es gibt einen großen Unterschied zwischen Routinen und Linien. Profiling-Routinen sollten Ihre App nicht zu sehr verlangsamen. Es ist nicht für mich.Das Profilieren nach Zeilen kann sehr langsam sein, ich denke, das ist es, was Sie jetzt tun.

Im Allgemeinen besteht die Idee darin, zuerst nach Routinen zu suchen, die Engpässe zu finden und dann diese (und nur diese) Routinen nach Zeilen zu profilieren.

+0

ich meine, dass der gleiche Effekt mehr oder weniger auf beiden passiert. Aber meine App ist ziemlich groß (über eine halbe Million Zeilen Code). Eigentlich kann ich noch nicht mal ganze Zeilen für die Überprüfung verwenden, da wenn ich versuche, die App damit zu starten, die Profilierung nach einigen Sekunden automatisch stoppt. Dieses Problem verschwindet, wenn ich die Bereiche radikal reduziere, so dass anscheinend die Zeilenmenge eine obere Grenze hat, nach der Probleme (außer der Leistung) auftreten. Ich weiß, dass die Drill-Down-Ansatz verwendet werden sollte, aber mit jedem Lauf dauert bis zu einer Stunde oder so, ich möchte nicht zu viele von ihnen machen .. :( –

0

Haben Sie nach

AQtimeHelpers.EnableProfiling(false); 

am Beginn Ihrer Vorbereitung und dann

AQtimeHelpers.EnableProfiling(True); 

mit versucht?

+0

Nein - Ich möchte nicht meine ändern Code, wenn möglich zu vermeiden, aber es ist gut zu wissen, dass so etwas existiert Ich könnte es versuchen, wenn ich die anderen Problemumgehungen an einem Punkt nicht nutzen kann - danke! –

0

Sie müssen einen Drill-Down-Ansatz verwenden. Identifizieren Sie zuerst die Bereiche, für die eine Profilerstellung erforderlich ist, identifizieren Sie, welche Prozeduren profiliert werden müssen, profilieren Sie nur diese und wechseln Sie zur Profilerstellung nur dann, wenn Sie genau die Codezeile ermitteln müssen, die beachtet werden muss. Wenn Sie die vollständige Profilerstellung der Anwendung pro Zeile aktivieren, wird die von AQTime durchgeführte Instrumentierung so umfangreich sein und die gesammelten Daten werden Ihre Anwendung stark verlangsamen.

+0

Ich weiß, dass der Drill-Down-Ansatz verwendet werden sollte, aber mit jedem Lauf, auch ohne Profiling, zum Beispiel 15 Minuten, würde ich nicht zu viele von ihnen machen wollen .. :(. Aber ich muss damit ertragen, denke ich. –