Ho esaminato e concordato con tutti i suggerimenti. Ma volevo condividere una implementazione generica per il logger di esecuzione quando non vogliamo implementare la logica di Stopwatch più volte, ma vuole ancora misurare il tempo di esecuzione per più metodi.
Il motivo principale per cui non è necessario implementare il programma di registrazione in modo generico è - l'esecuzione del metodo è tra stopwatch.Start() e stopwatch.Stop() inoltre potremmo richiedere il risultato del metodo dopo l'esecuzione per un'ulteriore elaborazione.
Quindi, per risolvere questo problema, ho creato la seguente implementazione di esempio in cui il tempo di esecuzione viene registrato separatamente senza miscelarlo con il flusso del metodo effettivo.
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);
}
Calling Parte:
static void Main()
{
ILogger log = new Log();
Arithmatic obj = new Arithmatic(log);
obj.Calculate(10, 3);
Console.ReadLine();
}
fonte
2016-09-01 18:02:54
se si imposta timer.stop(); dopo Start() è normale. Quando è necessario fermare il timer? Quando la funzione è finita? –
perché non StopWatch? (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – VJAI
Possibile duplicato di [Misurazione del tempo di esecuzione del codice] (https://stackoverflow.com/questions/16376191/measuring- code-execution-time) –