performance - una - vectores con letras matlab




¿Cómo comparar procesos de Matlab? (2)

Buscando una idea de cómo evitar el uso de bucles en mi código de Matlab, encontré los siguientes comentarios en una pregunta sobre SE :

La declaración "para los bucles son lentos en Matlab" ya no es generalmente cierta desde Matlab ... euhm, R2008a?

y

¿Has tratado de comparar un bucle for vs lo que ya tienes? a veces es más rápido que el código vectorizado ...

Así que me gustaría preguntar, ¿hay alguna forma común de probar la velocidad de un proceso en Matlab ? ¿Puede el usuario ver en algún lugar cuánto tiempo lleva el proceso o la única forma es extender los procesos durante varios minutos para comparar los tiempos entre ellos?


Creo que estoy en lo cierto al afirmar que muchos de nosotros compramos el tiempo de Matlab envolviendo el bloque de código que nos interesa entre tic y toc . Además, nos aseguramos de que el tiempo total sea del orden de 10 segundos (en lugar de 1 segundo o 100 segundos) y lo repetimos de 3 a 5 veces y tomamos una medida de la tendencia central (como la media) y sacar nuestras conclusiones de eso.

Si la pieza de código toma menos de, digamos 10s, entonces repítalo tantas veces como sea necesario para ponerlo en el rango, teniendo cuidado de evitar cualquier impacto de una iteración en la siguiente. Y si el código tarda 100 segundos o más, pase más tiempo en las pruebas o inténtelo con datos de entrada artificialmente pequeños para que se ejecuten más rápidamente.

En mi experiencia, no es necesario ejecutar programas por minutos para obtener datos en tiempo de ejecución promedio con una varianza aceptablemente baja. Si ejecuto un programa 5 veces y uno (o dos) de los resultados es tremendamente diferente de la media, lo volveré a ejecutar.

Por supuesto, si el código tiene alguna característica que hace que su tiempo de ejecución no sea determinista, entonces es un asunto diferente.


Puede usar el generador de perfiles para evaluar cuánto tiempo están tomando sus funciones y los bloques de código que contienen.

>> profile on; % Starts the profiler
>> myfunctiontorun( ); % This can be a function, script or block of code
>> profile viewer; % Opens the viewer showing you how much time everything took

El visor también borra los datos del perfil actual para la próxima vez.

Tenga en cuenta que el perfil tiende a ralentizar la ejecución un poco, pero creo que lo hace de manera uniforme en todo.

Obviamente, si su función es muy rápida, es posible que no obtenga resultados confiables, por lo que si puede ejecutarla muchas veces o extender el cálculo que mejoraría las cosas.

Si estás probando cosas realmente simples, también puedes tic utilizando tic y toc :

>> tic; % Start the timer
>> myfunctionname( );
>> toc; % End the timer and display elapsed time

Además, si desea varios temporizadores, puede asignarlos a variables:

>> mytimer = tic;
>> myfunctionname( );
>> toc(mytimer);

Finalmente, si desea almacenar el tiempo transcurrido en lugar de mostrarlo:

>> myresult = toc;




vectorization