2009-03-24 13 views
11

Ich fand dies in einigen Login-Code Produktion ich vor kurzem war auf der Suche ...Welchen Leistungseinfluss hat die Ablaufverfolgung in C# und ASP.NET?

HttpContext.Current.Trace.Write(query + ": " + username + ", " + password)); 

... wo Abfrage eine kurze SQL-Abfrage ist passend zu den Benutzern zu greifen. Hat das irgendwelche Auswirkungen auf die Leistung? Ich nehme an, es ist sehr klein.

Auch was ist der Zweck dieser genauen Art von Ablaufverfolgung, die den HTTP-Kontext verwendet? Wohin werden diese Daten zurückverfolgt? Danke im Voraus!

Antwort

16

Ja, es hat Auswirkungen auf die Leistung, wenn die bedingte Kompilierungskonstante von TRACE während des Builds definiert wird. Etwas zu tun hat irgendeine Art von Auswirkung :)

Ob dies eine signifikante Auswirkung auf eine Anwendung hat oder nicht. Es ist sehr unwahrscheinlich, dass Trace so ausgeführt wird und in vielen Produktionsanwendungen läuft. Nur ein Missbrauch des Features sollte zu einem bemerkenswerten Leistungsunterschied führen.

Aber wie immer, traue mir nicht, vertraue dem Profiler.

+0

Also Tracing Anrufe haben keine Auswirkungen, wenn man auf der Seite oder in der web.config deaktiviert die Ablaufverfolgung? Werden sie "optimiert", wenn die Seite im laufenden Betrieb kompiliert wird? –

2

Trace-Nachrichten können an viele verschiedene Orte gehen. Sie können TraceListeners für die Konsole, das VisualStudio-Debug-Fenster, Dateien oder das Ereignisprotokoll hinzufügen (oder entfernen), um nur einige zu nennen. Sie können sogar Ihre eigenen bauen.

Sie können Trace auch so konfigurieren, dass bei der Kompilierung für Release keine Aktionen ausgeführt werden.

Der Leistungseinfluss bei der Verwendung von Trace kann also sehr unterschiedlich sein, von null bis hin zur völligen Ausnutzung der App, je nachdem, welche Listener aktiv sind. Die meisten Zuhörer haben jedoch die Auswirkungen, die Sie erwarten würden. Es erfordert so viel Arbeit, in eine Datei, eine Datenbank oder die Konsole zu schreiben, und Trace fügt nicht so viel Overhead hinzu wie diese E/A-gebundenen Aktivitäten.

3

Der meiste Leistungsverlust in diesem Codeabschnitt befindet sich nicht in der Ablaufverfolgung, aber in der Zeichenfolge-Verkettung durch die Verwendung des Operator +. Dies führt zu einigen ineffizienten Speicheroperationen, die eine IO-Operation in Bezug auf die Leistung übertreffen können. Ich würde es ändern, um etwas wie string.Concat oder die StringBuilder-Klasse (oder string.Format für diese Angelegenheit) zu verwenden.

1

Und wenn Trace wird in eine Textdatei zu schreiben es wird mehr kosten als das Schreiben IMHO

+1

Hängt davon ab. Wenn die Datei gepuffert ist und nur leer ist, wenn der Puffer voll ist, brauchen Sie im Durchschnitt weniger Zeit. Schreiben in eine GUI-Konsole ist ziemlich teuer, was mit Schriftart-Rendering, Anti-Aliasing, Ausschnitt-Clipping, etc. – TMN

+0

In der Tat dachte ich über Kosten des Schreibens an die Konsole, und dachte, es wäre weniger teuer, aber wenn Sie so sagen, das ist Richtig ... – erdogany

+0

Konsole ist teuer, besonders unter Windows. Ausführungsblöcke während des Wartens darauf, dass die Konsole den Text konsumiert. Wenn Sie nun die Konsole puffern, schreiben Sie sich z. Mit einem Autorenthread würden Sie nicht die gesamte Blockierung bemerken (es sei denn, Sie haben keinen Speicher mehr, weil Ihre Warteschlange schneller wächst als die Konsole sie verbraucht ;-)). – binki

5

ich noch die Rating-Punkte für Kommentare haben nicht zu trösten, aber ich wollte eine schnelle Aussage über Jonathan Antwort machen. Die Zahlen, die ich gesehen habe, scheinen zu zeigen, dass es keinen Sinn macht, Stringbuilder für eine Handvoll String-Verkettungen zu verwenden. Der Aufwand beim Erstellen des Stringbuilder-Objekts überwiegt den Vorteil der Verkettungsgeschwindigkeit.

1

Ich denke, Trace Source schaut auf den TraceLevel seines Switches, bevor Nachrichten an die Listener weitergeleitet werden. Wenn wir also den Standard-TraceLevel-Wert des Schalters auf "Error" setzen, würde der Verfolgungs-Overhead stark reduziert, da nur "Fehler" -Spuren an Listener gesendet würden.

nur eine Vermutung ... ich habe noch nichts gemessen. Wird aktualisiert, wenn ich es tue.

2017 Update: scheint eine veraltete, aber eine sehr praktische Möglichkeit zum Verfolgen/Protokollieren von Informationen zu einem Browser/remote zugänglichen ASPX-Seite in einer asp.net-Anwendung.

https://msdn.microsoft.com/en-IN/library/z48bew18(v=vs.71).aspx