Laden...

"System.Reflection.MethodBase" durch "System.Diagnostics.StackFrame(1)" ersetzen?

Erstellt von AtzeX vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.126 Views
A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren
"System.Reflection.MethodBase" durch "System.Diagnostics.StackFrame(1)" ersetzen?

Hallo zusammen.

Momentan nutze ich folgende Membervariable um mir die Klasse für das Logging zu merken:

private static string _className = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

Zudem habe ich in jeder Methode, in welcher ich etwas loggen möchte, ganz oben diese Zeile um die aktuelle Methode zu ermitteln:

string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name;

Verwenden tue ich das dann z.B: mit einer statischen Log-Methode (exemplarisch):

Logging.Log(_className, methodName, "Meine Meldung.")

Nun überlege ich, ob ich die Ermittlung des Klassennamens und der Methodennamens nicht doch in die statische Methode "Log" verlege und dort z.B. mit

...System.Diagnostics.StackFrame(1).GetMethod().Name

usw. ermittle.

Ich würde nun gerne wissen, ob das Laufzeitverhalten dadurch verschlechtert wird.
Oder ist das eher marginal?

Gruß,
AtzeX

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo AtzeX,

warum machst du nicht einen Test bzgl. der Performanzunterschiede?

Bei Verwendung vom StackFrame musst du allerdings dafür sorgen, dass deine Log-Methode nicht geinlined wird. Sonst bekommst du völlig falsche Logmeldungen.

Gruß,
dN!3L

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren

Ich hatte ja schon darauf gehofft, dass diese Erfahrungen hier schon mal gesammelt wurden.

Wenn ich das selber teste, muss ich ja, wie du schon schreibst, darauf achten, keine verfälschten Testergebnisse zu produzieren.
Nur wie soll ich das beeinflussen.
Woher soll ich wissen, was der Compiler bei Schleifen z.B. 'weg-optimiert'?

Gruß,
AtzeX

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo AtzeX,

Nur wie soll ich das beeinflussen.

Wenn du die StackFrame-Methode benutzt, sollte deine Log-Methode unbedingt das Attribut [MethodImpl(MethodImplOptions.NoInlining)] bekommen. Mehr Infos zu CallStacks in Release-Builds siehe z.B. in Scott Hanselman's Computer Zen - Release IS NOT Debug: 64bit Optimizations and C# Method Inlining in Release Build Call Stacks

Gruß,
dN!3L

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren

Danke dir, werde ich mir morgen durchlesen. 😃

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 14 Jahren

So, ich habe mir mal Testroutinen gemacht.
Alles in allem ist die Technik mit dem StackFrame langsamer, aber das ist im Kontext der Verwendung eher marginal.

Bei 1000000 Wiederholungen habe ich einen Faktor 2-4, je nach CPU-Type (bei x86 ist der Faktor ca. 2, bei x64 ist er ca. 4).

Bei 1000 Wiederholungen sind die Faktoren in etwa gleich (also nach wie vor 2 bzw. 4), aber auf meinem Rechner lediglich im Bereich von 10-20 Millisekunden Unterschied.

Von daher werde ich die Stackframes verwenden.

Gruß,
Axel