¿Hay una mejor manera de cronometrar eventos en C#?

Declaré las siguientes variables:

    private Stopwatch stopwatch;
    private long t1, t2, t3, t4, t5;

y estoy usando cronómetro así:

         try {
            stopwatch = Stopwatch.StartNew();
            get1();
            t1 = stopwatch.ElapsedMilliseconds;
            anotherGet();
            t2 = stopwatch.ElapsedMilliseconds;
            vm.Detail = anotherAnotherGet();
            t3 = stopwatch.ElapsedMilliseconds;
        } catch (Exception e) {
            log(e);
        } finally {
            Stopwatch.Stop();
            if (vm.Detail.Count() > 0) {
                return PartialView("Details", vm);
            } else {
                return Content("No records found");
            }
        }

¿Hay una mejor manera de almacenar mis tiempos en lugar de largos llamados 1-5? El problema es que en algunas áreas del código podría necesitar solo t1 y en otras áreas podría necesitar más de 5 puntos de tiempo.

Estoy usando finalmente para parar. ¿Es esa la forma correcta de hacer esto?

preguntado el 28 de agosto de 12 a las 10:08

Deberías usar vm.Detail.Any() en lugar de vm.Detail.Count() > 0. -

Muchas gracias por la sugerencia sobre .Any() -

3 Respuestas

Podría usar un Diccionario para poder almacenar los valores bajo un nombre/clave.

Tenga en cuenta que agregar los valores a una colección puede llevar algo de tiempo que podría influir en sus medidas.

Entonces es posible que desee hacer esto:

stopwatch = Stopwatch.StartNew(); 
get1(); 
stopwatch.Stop();
timings.Add("t1", stopwatch.ElapsedMilliseconds); 
stopwatch.Start();

El finalmente está bien

Respondido 28 ago 12, 10:08

Simplemente use un List<long> para almacenar tantas veces como necesites:

var times = new List<long>();
stopwatch = Stopwatch.StartNew();
get1();
times.Add(stopwatch.ElapsedMilliseconds);
anotherGet();
times.Add(stopwatch.ElapsedMilliseconds);
vm.Detail = anotherAnotherGet();
times.Add(stopwatch.ElapsedMilliseconds);

Poniendo su lógica de limpieza dentro finally realmente no hace nada aquí porque justo antes de eso, usted está atrapando y tragando incondicionalmente todo tipo de excepciones, que es muy muy malo.

Respondido 28 ago 12, 10:08

Gracias Estoy haciendo esto solo en el código de informe, pero estoy de acuerdo en que no manejé las excepciones y agregaré un código para hacer algo si cae en el bloque de excepciones. Estaba pensando que finalmente siempre se ejecuta incluso si algo cae en el pestillo, así que detuve el cronómetro allí. ¿Está mal mi pensamiento? - Angela

@Angela: No, esa parte es bastante correcta. Lo más probable es que debas detener el temporizador en el interior. finally y devolver el contenido después finally (solo devolver contenido si no se lanza ninguna excepción). - Jon

Podrías guardarlos en un List<long>

List<long> times = new List<long>();

Y ellos simplemente

times.Add(stopwatch.ElapsedMilliseconds);

Respondido 28 ago 12, 10:08

Podría correr el tiempo en diferentes lugares. ¿Hay alguna forma de declarar los tiempos como privados en la parte superior de mi código y luego borrar la lista cada vez que se ejecuta? - Angela

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.