Pregunta

Soy un novato total, pero estaba escribiendo un pequeño programa que funcionaba con cadenas en C# y noté que si hacía algunas cosas de manera diferente, el código se ejecutaba significativamente más rápido.

Entonces me pregunté: ¿cómo puedo controlar la velocidad de ejecución de mi código?¿Existen servicios públicos (gratuitos)?¿Lo haces a la antigua usanza con un System.Timer y lo haces tú mismo?

¿Fue útil?

Solución

Lo que estás describiendo se conoce como perfiles de rendimiento.Hay muchos programas que puedes conseguir para hacer esto, como Perfilador Jetbrains o perfilador de hormigas, aunque la mayoría ralentizará su aplicación mientras mide su rendimiento.

Para crear manualmente su propio perfil de rendimiento, puede utilizar Sistema.Diagnóstico.Cronómetro y un Console.WriteLine simple, como lo describiste.

También tenga en cuenta que el compilador C# JIT optimiza el código según el tipo y la frecuencia con la que se llama, así que juegue con bucles de diferentes tamaños y métodos, como llamadas recursivas, para tener una idea de qué funciona mejor.

Otros consejos

Perfilador de ANTS de RedGate es un perfilador de rendimiento realmente bueno. Perfilador dotTrace de JetBrains también es genial.Estas herramientas le permitirán ver métricas de rendimiento que se pueden desglosar en cada línea individual.

Captura de pantalla de ANTS Profiler:HORMIGAS http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

Si desea asegurarse de que un método específico permanezca dentro de un umbral de rendimiento específico durante las pruebas unitarias, usaría el Stopwatch clase monitorear el tiempo de ejecución de un método una o muchas veces en un bucle y calcular el promedio y luego Assert contra el resultado.

Sólo un recordatorio: ¡asegúrese de compilar en Relase, no en Debug!(He visto este error cometido por desarrolladores experimentados; es fácil de olvidar).

Lo que estás describiendo es "Ajuste del rendimiento".Cuando hablamos de ajuste del rendimiento, hay dos ángulos.(a) Tiempo de respuesta: cuánto tiempo lleva ejecutar una solicitud/programa en particular.(b) Rendimiento: cuántas solicitudes puede ejecutar en un segundo.Cuando normalmente "optimizamos", cuando eliminamos el procesamiento innecesario, mejoran tanto el tiempo de respuesta como el rendimiento.Sin embargo, si tiene eventos de espera en su código (como Thread.sleep(), espera de E/S, etc.), su tiempo de respuesta se ve afectado, pero el rendimiento no se ve afectado.Al adoptar el procesamiento paralelo (generando múltiples subprocesos), podemos mejorar el tiempo de respuesta, pero no mejorará el rendimiento.Normalmente, para las aplicaciones del lado del servidor, tanto el tiempo de respuesta como el rendimiento son importantes.Para las aplicaciones de escritorio (como IDE), el rendimiento no es importante, solo el tiempo de respuesta es importante.

Puede medir el tiempo de respuesta mediante 'Pruebas de rendimiento'; simplemente anote el tiempo de respuesta de todas las transacciones clave.Puede medir el rendimiento mediante 'Pruebas de carga': debe bombear solicitudes continuamente desde una cantidad suficientemente grande de subprocesos/clientes de modo que el uso de CPU de la máquina servidor sea del 80-90%.Cuando bombeamos solicitudes, necesitamos mantener la proporción entre diferentes transacciones (llamada combinación de transacciones), por ejemplo:en un sistema de reservas habrá 10 reservas por cada 100 búsquedas.Habrá una cancelación por cada 10 reservas, etc.

Después de identificar las transacciones que requieren un ajuste del tiempo de respuesta (pruebas de rendimiento), puede identificar los puntos críticos utilizando un generador de perfiles.Puede identificar los puntos críticos de rendimiento comparando el tiempo de respuesta * la fracción de esa transacción.Supongamos que en el escenario de búsqueda, reserva y cancelación, la proporción es 89:10:1.Los tiempos de respuesta son 0,1 segundos, 10 segundos y 15 segundos.Carga para la búsqueda - 0.1 * .89 = 0.089 Carga para la reserva- 10 * .1 = 1 Carga para Cancell = 15 * .01 = 0.15 Aquí la reserva de sintonización producirá el máximo impacto en el rendimiento.También puede identificar puntos críticos de rendimiento realizando volcados de subprocesos (en el caso de aplicaciones basadas en Java) repetidamente.

Utilice un perfilador.

Si necesita cronometrar solo un método específico, la clase Stopwatch podría ser una buena opción.

Hago las siguientes cosas:1) Utilizo garrapatas (p. ej.en VB.Net Now.ticks) para medir la hora actual.Resto los ticks iniciales del valor de los ticks finales y los divido por TimeSpan.TicksPerSecond para obtener cuántos segundos tomó.2) Evito las operaciones de UI (como console.writeline).3) Ejecuto el código en un bucle sustancial (como 100.000 iteraciones) para factorizar las variables de uso/sistema operativo lo mejor que puedo.

Puede utilizar la clase StopWatch para cronometrar métodos.Recuerde que la primera vez suele ser lenta debido a que es necesario modificar el código.

Existe una opción .NET nativa (Team Edition para desarrolladores de software) que podría abordar algunas necesidades de análisis de rendimiento.Desde el menú .NET IDE 2005, seleccione Herramientas->Herramientas de rendimiento->Asistente de rendimiento...

[GSS probablemente tenga razón en que debes tener Team Edition]

Este es un ejemplo sencillo para probar la velocidad del código.Espero haberte ayudado

class Program {
    static void Main(string[] args) {
        const int steps = 10000;
        Stopwatch sw = new Stopwatch();

        ArrayList list1 = new ArrayList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list1.Add(i);
        }
        sw.Stop();
        Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);

        MyList list2 = new MyList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list2.Add(i);
        }
        sw.Stop();
        Console.WriteLine("MyList:  \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top