Ich überprüfte und stimmte allen Vorschlägen zu. Aber wir wollten eine generische Implementierung für den Ausführungszeitlogger teilen, bei der wir die Stoppuhrlogik nicht mehrfach implementieren wollen, aber dennoch die Ausführungszeit für mehrere Methoden messen wollen.
Der Hauptgrund dafür, Logger nicht generisch zu implementieren, ist - die Ausführung der Methode ist zwischen stopwatch.Start() und stopwatch.Stop(). Außerdem können wir nach der Ausführung das Methodenergebnis zur weiteren Verarbeitung benötigen.
Um dieses Problem anzugehen, habe ich folgende Beispielimplementierung erstellt, wobei die Ausführungszeit separat protokolliert wird, ohne sie mit dem tatsächlichen Methodenfluss zu mischen.
public static class Helper
{
public static T Time<T>(Func<T> method, ILogger log)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
var result = method();
stopwatch.Stop();
log.Info(string.Format("Time Taken For Execution is:{0}", stopwatch.Elapsed.TotalMilliseconds));
return result;
}
}
public class Arithmatic
{
private ILogger _log;
public Arithmatic(ILogger log)//Inject Dependency
{
_log = log;
}
public void Calculate(int a, int b)
{
try
{
Console.WriteLine(Helper.Time(() => AddNumber(a, b), _log));//Return the result and do execution time logging
Console.WriteLine(Helper.Time(() => SubtractNumber(a, b), _log));//Return the result and do execution time logging
}
catch (Exception ex)
{
_log.Error(ex.Message, ex);
}
}
private string AddNumber(int a, int b)
{
return "Sum is:" + (a + b);
}
private string SubtractNumber(int a, int b)
{
return "Subtraction is:" + (a - b);
}
}
public class Log : ILogger
{
public void Info(string message)
{
Console.WriteLine(message);
}
public void Error(string message, Exception ex)
{
Console.WriteLine("Error Message:" + message, "Stacktrace:" + ex.StackTrace);
}
}
public interface ILogger
{
void Info(string message);
void Error(string message, Exception ex);
}
Aufruf Teil:
static void Main()
{
ILogger log = new Log();
Arithmatic obj = new Arithmatic(log);
obj.Calculate(10, 3);
Console.ReadLine();
}
wenn Sie setzen timer.stop() zu verarbeiten beginnt; nach Start() ist normal. Wann muss der Timer gestoppt werden? Wenn die Funktion beendet ist? –
warum nicht Stoppuhr? (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – VJAI
Mögliches Duplikat von [Ausführungszeit des Messcodes] (https://stackoverflow.com/questions/16376191/measuring- code-execution-time) –