cronometro - tiempo de ejecucion de un programa c#
¿Cómo mido cuánto tiempo se está ejecutando una función? (10)
Debe usar la clase de cronómetro para las funciones de temporización.
Pruebe lo siguiente:
private int counter = 0;
// setup stopwatch and begin timing
var timer = System.Diagnostics.Stopwatch.StartNew();
Result result = new Result();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);
// stop timer and get elapsed time
timer.Stop();
var elapsed = timer.Elapsed;
// display result time
MessageBox.Show(elapsed.ToString("mm'':''ss'':''fff"));
Quiero ver cuánto tiempo se está ejecutando una función. Así que agregué un objeto de temporizador en mi formulario, y salí con este código:
private int counter = 0;
// Inside button click I have:
timer = new Timer();
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
Result result = new Result();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);
timer.Stop();
Y:
private void timer_Tick(object sender, EventArgs e)
{
counter++;
btnTabuSearch.Text = counter.ToString();
}
Pero esto no cuenta nada. ¿Por qué?
La mejor forma de ver cuánto tarda un bit de código en ejecutarse es utilizar System.Diagnostics.Stopwatch
.
Aquí hay un ejemplo:
using System.Diagnostics;
#if DEBUG
Stopwatch timer = new Stopwatch();
timer.Start();
#endif
//Long running code
#if DEBUG
timer.Stop();
Debug.WriteLine("Time Taken: " + timer.Elapsed.TotalMilliseconds.ToString("#,##0.00 ''milliseconds''"));
#endif
Utilizo #if DEBUG
para asegurarme de que el código del cronómetro no entre en la versión de producción, pero podría prescindir de él.
No use un temporizador: use la clase msdn.microsoft.com/en-us/library/… .
var sw = new Stopwatch();
Result result = new Result();
sw.Start();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);
sw.Stop();
// sw.Elapsed tells you how much time passed
Para cronometrar una función, debe usar la msdn.microsoft.com/en-us/library/…
Además, la razón por la que su temporizador no cuenta es porque no estableció un intervalo para ello.
Para evitar problemas futuros con un temporizador, este es el código correcto:
timer = new Timer();
timer.Tick += new EventHandler(timer_Tick);
timer.Interval = 1; //set interval on 1 milliseconds
timer.Enabled = true; //start the timer
Result result = new Result();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);
timer.Enabled = false; //stop the timer
private void timer_Tick(object sender, EventArgs e)
{
counter++;
btnTabuSearch.Text = counter.ToString();
}
Pero es el enfoque equivocado. Debe utilizar la clase msdn.microsoft.com/en-us/library/… porque es un temporizador de alta resolución y la palabra Diagnóstico lo dice todo.
Entonces intente esto:
Stopwatch timer = Stopwatch.StartNew();
Result result = new Result();
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia);
timer.Stop();
TimeSpan timespan = timer.Elapsed;
btnTabuSearch.Text = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);
Revisé y acepté todas las sugerencias. Pero quería compartir una implementación genérica para el registrador de tiempo de ejecución donde no queremos implementar la lógica de Cronómetro varias veces, pero aún queremos medir el tiempo de ejecución para múltiples métodos.
La razón principal para no implementar el registrador de forma genérica es que la ejecución del método se encuentra entre cronómetro.Start () y cronómetro.Detener () también podemos requerir el resultado del método después de la ejecución para su posterior procesamiento.
Para abordar este problema creé la siguiente implementación de ejemplo, donde el tiempo de ejecución se registra por separado sin mezclarlo con el flujo de método real.
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);
}
Parte llamante:
static void Main()
{
ILogger log = new Log();
Arithmatic obj = new Arithmatic(log);
obj.Calculate(10, 3);
Console.ReadLine();
}
Tal vez, podrías escribir un método como ese:
public static void Time(Action action)
{
Stopwatch st = new Stopwatch();
st.Start();
action();
st.Stop();
Trace.WriteLine("Duration:" + st.Elapsed.ToString("mm//:ss//.ff"));
}
Y úsalo así:
Time(()=>
{
CallOfTheMethodIWantToMeasure();
});
Use el Stopwatch de System.Diagnostics:
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
}
registrar el tiempo cuando el paso actual comienza a procesar
DateTime dtStart = DateTime.Now;
//Calculate the total number of milliseconds request took (Timespan = to represent the time interval)-> current - started time stamp ...
//TotalMilliseconds -->Gets the value of the current TimeSpan structure expressed in whole and fractional milliseconds.
// to measure how long a function is running
var result=((TimeSpan)(DateTime.Now - dtStart)).TotalMilliseconds.ToString("#,##0.00") + "ms";
Visual Studio 2015 , 2017 Professional and Enterprise tiene una herramienta de diagnóstico. Si tiene un punto de interrupción al final de su función, mostrará la hora y la duración en la pestaña Eventos como se muestra en la imagen:
Puede ver el artículo Depurador de herramientas de diagnóstico en Visual Studio 2015 para obtener más detalles.
PD; Hasta ahora solo Xamarin se forma, el proyecto multiplataforma no es compatible con esta característica. Ojalá Microsoft también presente esta gran característica para los proyectos de formularios xamarin.