daxcor
7/23/2013 - 1:32 AM

Clase para cronometrar procesos

Clase para cronometrar procesos

using System;
using System.Diagnostics;
using System.Text;

namespace Rutinas.Service
{
    public sealed class Benchmark
    {
        public enum Salida
        {
            porConsola,
            porConsolaVS
        }

        public static void Proceso(Action accion, string mensaje = "Tiempo de proceso: ", Salida salida = Salida.porConsolaVS)
        {
            Stopwatch cronometro = Stopwatch.StartNew();

            cronometro.Reset();
            cronometro.Start();

            accion();

            cronometro.Stop();

            Imprimir(Resultado(ref cronometro), mensaje, salida);
        }

        private static void Imprimir(string resultado, string mensaje, Salida salida)
        {
            switch (salida)
            {
                case Salida.porConsola:
                    Console.WriteLine(mensaje + resultado);
                    break;
                case Salida.porConsolaVS:
                    Debug.WriteLine(mensaje + resultado);
                    break;
                default:
                    Debug.WriteLine(mensaje + resultado);
                    break;
            }
        }

        private static string Resultado(ref Stopwatch cronometro)
        {
            const string SEPARADOR = ":";
            const string CEROS = "00";

            string vacio = CEROS + SEPARADOR;
            StringBuilder cadena = new StringBuilder();

            cadena.Append((cronometro.Elapsed.Hours != 0) ? cronometro.Elapsed.Hours.ToString() + SEPARADOR : vacio);
            cadena.Append((cronometro.Elapsed.Minutes != 0) ? cronometro.Elapsed.Minutes.ToString() + SEPARADOR : vacio);
            cadena.Append((cronometro.Elapsed.Seconds != 0) ? cronometro.Elapsed.Seconds.ToString() + SEPARADOR : vacio);
            cadena.Append((cronometro.Elapsed.Milliseconds != 0) ? cronometro.Elapsed.Milliseconds.ToString() : vacio);

            return cadena.ToString().Trim();
        }
    }
}