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
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
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
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
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