Ayuda de MetaEditorDesarrollo de programasPerfilado del código

Perfilado del código

El perfilado supone la recopilación de las características del programa durante su ejecución. Al realizar el perfilado, se miden el tiempo de ejecución y el número de llamadas de funciones y líneas individuales en el código del programa. Con esta herramienta, el programador puede encontrar las secciones más lentas del código y optimizarlas.

El perfilado se puede realizar de forma común en la plataforma comercial, y también usando los datos históricos con la ayuda del simulador de estrategias. En el primer caso, el programa se iniciará en un gráfico que se actualiza en tiempo real. Usted podrá verificar cómo se comporta el programa en condiciones de uso reales. En el segundo caso, el programa se iniciará en el simulador de estrategias en el modo visual. La ventaja de este método es que no necesita esperar la recepción de datos reales desde el servidor comercial o la aparición de ciertas condiciones comerciales.

Muchos programas, en especial los indicadores, ejecutan ciertos cálculos solo con la llegada de un nuevo tick (OnTick, OnCalculate). De esta forma, para valorar la productividad, debemos esperar la llegada de nuevos ticks en tiempo real. Mediante el uso de perfilado con datos históricos, usted podrá establecer la carga correcta y verificar el funcionamiento de los programas, incluso los fines de semana, cuando los mercados están cerrados.

Cómo tiene lugar el perfilado

Para realizar el perfilado, se usa el método "Sampling". El perfilador pausa el funcionamiento de un programa MQL (~10 000 veces por segundo) y recopila estadísticas sobre cuántas veces se ha hecho la pausa en ciertos sectores del código. Asimismo, se analizan las pilas de llamadas, para determinar el "aporte" de cada función al tiempo total de funcionamiento del código. Al final del perfilado, usted obtendrá estadísticas sobre el número de veces que se ha ejecutado la pausa y cuántas veces ha resultado cada una de las funciones en la pila de llamadas:

  • Actividad general de la CPU [unidad de medición, %] – número total de "apariciones" de la función en la pila de llamadas.
  • Actividad propia de la CPU [unidad de medición, %] – número de "pausas" ocurridas propiamente dentro de la función indicada. Este contador es el más importante para determinar los cuellos de botella, ya que, según las estadísticas, la pausa sucede con mayor frecuencia en los segmentos del programa que requieren mayor tiempo de funcionamiento por parte del procesador.

Sampling es un método ligero y preciso. A diferencia de otros, no introduce en el código analizado ningún cambio que pueda influir en su velocidad de funcionamiento.

Ajustes del perfilador

Por defecto, el programa perfilado se inicia en el gráfico abierto actual en la platafotma comercial. Si vamos a realizar el perfilado con datos históricos, se usarán los ajustes actuales del simulador de estrategias. En los ajustes del MetaEditor, usted podrá establecer cualquier otro gráfico y redefinir algunos ajustes de simulación.

Depuración

Aquí podrá activar o desactivar el inlining (incorporación) de funciones durante la compilación. Al activar el inlining, el código de las funciones se ubica directamente en lugar de su llamada, lo que permite conseguir una aceleración sustancial durante el funcionamiento. Sin embargo, esto dificulta el perfilado de funciones. Para obtener un informe de funciones "puras", usted podrá desactivar el inlining.

La opción solo desactiva el inlining explícito. Las funciones generadas de forma implícita por el compilador pueden permanecer activas. En el informe, se representarán con el prefijo [inlined].

Para aumentar el volumen de detalle del informe de perfilado, podrá desactivar el modo de optimización de código. Sin optimización, la velocidad del código puede disminuir varias veces, pero a cambio podrá ver una cobertura de código más amplia. Tenga en cuenta que al usar el código, los cuellos de botella resultarán imprecisos.

Asimismo, existe la posibilidad de gestionar la optimiazación del código en los ajustes de los proyectos.

  • Si la optimización está desactivada en el proyecto, la nueva opción se ignorará; la optimización siempre está desactivada para el perfilado (incluido el inlining).
  • Si la optimización está activada en el proyecto, la nueva opción se considerará al compilar para el perfilado.

Inicio de perfilado #

Abra el archivo del código fuente del programa (MQ4 o MQ5). En el menú "Depuración" o en la barra de herramientas "Estándar" haga clic en "Comenzar el perfilado con datos reales Comenzar el perfilado con datos reales" o "Comenzar el perfilado con datos históricos Comenzar el perfilado con datos históricos".

A continuación, se compila automáticamente una versión especial del programa para el proceso de perfilado. Dependiendo del tipo de perfilado elegido, el programa se iniciará en un gráfico regular en la plataforma comercial o en el simulador de estrategias (en el modo visual).

Ejecutar el perfilado en el gráfico en la plataforma comercial

  • Por defecto, la aplicación se inicia en el gráfico EURUSD H1. Para iniciarla con otro símbolo y periodo, indique estos en la pestaña "Depuración" en los ajustes del MetaEditor.
  • El realizar el perfilado en la historia, siempre se usa el modo no visual del simulador. El modo visual prácticamente no tiene sentido, dado que los recursos básicos se invierten en el dibujado, y no en los cálculos dentro del programa MQL

Después de iniciarlo, trabaje un poco de tiempo con la aplicación, aprovechando al máximo todas sus funciones. Es necesario para que el perfilador pueda medir el tiempo de ejecución de las funciones y líneas del programa.

A continuación, detenga el perfilado: elimine el programa del gráfico o haga clic en "Finalizar perfilado Finalizar perfilado" en el menú "Depurar" o en la barra de herramientas "Estándar".

Para que los resultados de perfilado obtenidos sean más precisos, se recomienda eliminar manualmente el programa del gráfico, en lugar de usar el comando "Finalizar perfilado Finalizar el perfilado".

Ver resultados de perfilado

Después de finalizar el perfilado, sus resultados se abrirán en la pestaña "Perfilador" o "Herramientas". Además, para mayor claridad, los resultados se mostrarán directamente en el código, resaltando las líneas con las funciones. Cuanto más llamativo sea el color con el que se resaltan, más tiempo se tardará en completar la función. De esta manera, podremos valorar de forma rápida y visual los cuellos de botella del programa.

El informe de perfilado se muestra en forma de funciones o líneas de código; para cada una de ellas hay dos indicadores disponibles:

  • Actividad general de la CPU [unidad de medición, %] – número total de "apariciones" de la función en la pila de llamadas.
  • Actividad propia de la CPU [unidad de medición, %] – número de "pausas" ocurridas propiamente dentro de la función indicada. Este contador es el más importante para determinar los cuellos de botella, ya que, según las estadísticas, la pausa sucede con mayor frecuencia en los segmentos del programa que requieren mayor tiempo de funcionamiento por parte del procesador.

Para el indicador se muestran el número absoluto y el porcentaje de la cantidad total.

Por defecto, la lista muestra las funciones grandes ubicadas en los niveles superiores. Para desplazarnos a las más pequeñas, deberemos clicar dos veces sobre una línea.

Resultados del perfilado

El informe de perfilado se puede ver de dos formas: por llamadas y por líneas. El segundo método nos permite explorar con el máximo detalle: así, encontraremos no solo las funciones más lentas, sino también las partes más lentas de ellas. Para alternar entre modos, podemos usar el menú contextual.

Para mayor comodidad, diversos elementos del lenguaje MQL se muestran en el informe como iconos:

  • Función personalizada– función personalizada.
  • Función de sistema – función de sistema.
  • Función de procesamiento de eventos– función de procesamiento de eventos (On*).
  • Método de clase– método de clase.
  • Método de clase protegida– método de clase protegida.

Además de los tipos de funciones especificados, el perfilador muestra:

  • Función de sistema@global_initializations: información sobre la inicialización de todas las variables globales.
  • Función de sistema@global_deinitializations: información sobre la desinicialización de todas las variables globales.

El número de línea y la ruta al archivo donde se encuentra la función se pueden ver situando el cursor del ratón sobre una línea en el informe. Para pasar a una función en un archivo, clicaremos dos veces sobre ella con el botón izquierdo del ratón.

No todas las funciones se muestran en el perfilador. Solo aparecerán las que hayan sido llamadas durante el funcionamiento del programa.

Menú contextual #

Los siguientes comandos están disponibles en el menú contextual:

  • Abrir – ir a una línea o función dentro del archivo del código fuente. Puede realizar la misma acción haciendo doble clic o pulsando la tecla Enter.
  • Maximizar todas – maximizar todas las funciones minimizadas.
  • Minimizar todas –  minimizar todas las funciones maximizadas.
  • Funciones por líneas – ir al modo de representación de resultados del perfilado por líneas.
  • Funciones por llamadas – ir al modo de representación de resultados del perfilado por llamadas.
  • Exportar – exportar los resultados del perfilado en el formato Open XML (MS Office Excel), HTML (Internet Explorer) o CSV (archivo de texto).
  • Autoajustar – habilitar/deshabilitar el modo de ajuste automático de los campos. La misma acción se realiza con la tecla "A".
  • Cuadrícula – mostrar/ocultar la cuadrícula que divide los campos. La misma acción se realiza con la tecla "G".