Lienzo vs. Etiquetas

 

Me gustaría presentarles una comparación de la velocidad de las pantallas para mostrar el texto en el gráfico, creado con diferentes métodos. La primera variante de la pantalla la hice usando la clase CCanvas, la segunda la creé sobre etiquetas (CChartObjectLabel). Todas las clases se tomaron de la biblioteca estándar. Esta idea se me ocurrió cuando creé una pantalla en CCanvas y ralentizó significativamente mi Expert Advisor. Al mismo tiempo, algunos programadores afirmaron que yo estaba equivocado yCCanvas, y para ser más precisos, OBJ_BITMAP_LABEL es muy rápido, más rápido que todos los métodos de visualización de información en el gráfico disponible en MetaTrader.Así que decidí comprobarlo experimentalmente. Entonces, el momento de la verdad.

Funcionamiento de la pantalla con salida enCCanvas

CCanvas

Carga de la CPU en este momento

CPU

Funcionamiento de la pantalla con salidaCChartObjectLabel

Etiquetas

Funcionamiento deCChartObjectLabel con CChartObjectLabel con el modo de optimización de la velocidad activado (te lo cuento a continuación).

Etiquetas optimizadas

Ahora los valores del tiempo. El total es el tiempo total de funcionamiento del Asesor Experto de prueba. El retardo mínimo, elretardo medio y el retardomáximo sonperíodos de retardo en ticks. Pero no siempre se pueden obtener correctamente, a pesar de que he comprobado el código, no había errores. Creo que tiene que ver con la función GetTickCount64 en el probador. Pero es un problema insignificante. Lo principal es que muestra el tiempo total.

Ahora permítanme hablar brevemente sobre la optimización de la visualización en las etiquetas. La cuestión es que para que el texto aparezca en la pantalla es necesario mostrar las líneas de un conjunto especial de líneas en las etiquetas, que están dispuestas de arriba a abajo en el número de 50 piezas. Pero cuando sólo se actualiza la última línea, no es necesario actualizar todas las etiquetas, basta con actualizar sólo una etiqueta que corresponde a esta línea. Si activamos el modo optimizeUpdate, obtendremos una ganancia de rendimiento de más del doble.

Decidí probar la pantalla en las etiquetas con más detalle, ya que este período de prueba es demasiado pequeño para ella, debido a su velocidad. Por lo tanto, aumenté el período de prueba. Y obtuve los siguientes resultados.

SinoptimizeUpdate: false

optimizeUpdate: false

ConoptimizeUpdate: true

optimizeUpdate: true

He añadido todos los resultados a Excel

Comparación de resultados

El primer histograma muestra la comparación global, el segundo sólo muestra la variante con etiquetas.

Conclusión: la visualización creada en CChartObjectLabel puede ser 83,7 veces más rápida que la equivalente en CCanvas. No en vano se considera que las operaciones de píxeles son las más costosas de todos los programas.

Adjunto una tabla con los resultados de las pruebas. Elcódigo fuente puede descargarse de KB:https://www.mql5.com/ru/code/33898


Archivos adjuntos:
 

No entiendo por qué la comparación fue en el Visualizador y no en el Terminal?

No he mirado el código. Para tales tareas Kanvas se hace uno para todas las "50 líneas".


En el Terminal, medí a través de la barra de uso. Los métodos no muestran diferencias significativas.

 
fxsaber:

No entiendo por qué la comparación fue en el Visualizador y no en el Terminal?

Porque en el Visualizador es la lentitud de Canvas la que está causando los problemas. Y puedes ver cuáles son. Una pantalla de este tipo consume más del 50% del tiempo de la CPU, ¡ya lo he mencionado antes! Y en Terminal habría que llamar a los métodos en un bucle para ver todo. Pero no me molesté en hacerlo. Tengo un Asesor Experto que funciona en el bucle con la optimización fuera de línea, donde, de hecho, necesito una pantalla de este tipo con actualizaciones rápidas. Pero no estoy preparado para mostrarlo ahora porque el proyecto aún no está terminado.


fxsaber:

No he mirado el código. Para tales tareas Kanvas se hace uno para todas las "50 líneas".

Entonces, echa un vistazo. Es el único que hay.

 
Estás engañando a la gente.
Realmente quieres restregármelo por la nariz, ¿verdad?
Sabía que querrías hacer algo así. Y yo que sabía que te ibas a inventar algo así.

No sabe cómo preparar las pruebas de comparación.

 
Mihail Matkovskij:

Porque en el Visualizador, es la lentitud de Canvas la que causa los problemas. Y puedes ver cuáles son. Una pantalla de este tipo consume más del 50% del tiempo de la CPU, ¡ya lo he mencionado antes! Y en Terminal habría que llamar a los métodos en un bucle para ver todo. Pero no me molesté en hacerlo. Tengo un Asesor Experto que funciona en el bucle con la optimización fuera de línea, donde, de hecho, necesito una pantalla de este tipo con actualizaciones rápidas. Pero no estoy preparado para presentarlo en este momento, ya que el proyecto aún no está terminado.


Entonces échale un vistazo. Es el único que hay.

Bueno... si sólo escribes para un visualizador, entonces haz estos juegos solo. ¿No has oído nunca que cualquier gráfico, incluso las marcas de apertura/cierre de posición, ralentizan el renderizador? No.

Intentaré no molestar... crear etiquetas separadas para cada letra... y también un recurso separado...

 
Nikolai Semko:
Estás engañando a la gente.
Quieres restregármelo por la nariz, ¿verdad?
Sabía que querrías hacer algo así. Sabía que querrías hacer algo así.

No sabe cómo preparar las pruebas de comparación.

Lo único que entendí de tu post fueron las palabras "delirio", "LOL", "no sé preparar exámenes". Realmente, no entiendo cómo se relacionan con este tema... ¡El resto, no entiendo de la palabra "en absoluto"! Cuando creé este hilo, quería ver aquíuna crítica constructiva, ¡no un montón de reclamaciones incomprensibles! Así que, moléstate en explicar tus palabras. Por lo demás, ¡no escribas tonterías aquí!

 
Alexey Viktorov:

Bueno... si sólo escribes para el visualizador, entonces juega solo a estos juegos. ¿No has oído nunca que cualquier gráfico, incluso las marcas de apertura/cierre de posición, ralentizan el visualizador? No.

Intentaré no molestar... crear etiquetas separadas para cada letra... y también un recurso separado...

Me apresuro a informarte, Alexei. Tú, por supuesto, tiendes a fantasear, al igual que Nikolai... Pero en realidad no es como te imaginas. Sencillamente, se necesitan diferentes soluciones para diferentes tareas. ¿Tendrán tú y Nikolai algún comentario sustantivo?

 
Mihail Matkovskij:

Lo único que entendí de tu post fueron las palabras "delirio", "LOL", "no sé preparar exámenes". Realmente, no entiendo cómo se relacionan con este tema... ¡El resto, no entiendo de la palabra "en absoluto"! Cuando creé este hilo, quería ver aquíuna crítica constructiva, ¡no un montón de reclamaciones incomprensibles! Así que, moléstate en explicar tus palabras. Por lo demás, ¡no escribas tonterías aquí!

Paciencia, amigo mío, paciencia.
No tengo tanto tiempo como tú. Estoy en el último semestre y tengo tres proyectos de grupo en paralelo. Así que estoy aquí en modo impulso.
Pero, vale, puedo convencerte de que eres un iluso, sólo tienes que relajarte y no esforzarte tanto, si no mis esfuerzos serán en vano.
A menos, por supuesto, que tu mente pueda dominar tus emociones.
 
Nikolai Semko:
Paciencia, amigo mío, paciencia.
No tengo tanto tiempo como tú. Estoy en el último semestre y tengo tres proyectos de grupo en paralelo. Así que estoy aquí por impulso.
Pero, de acuerdo, puedo convencerte de tu engaño, sólo relájate y no te esfuerces tanto, si no mis esfuerzos serán en vano.

Adelante. Sólo hay que entenderbien el código primero, porque el código es una cosa complicada, ¡y necesito afirmaciones claramente fundamentadas!

 

No lo entiendo. La primera imagen tiene un lienzo y hay texto en él.

Las imágenes posteriores no tienen un texto similar en el gráfico.

¿Qué se comparaba entonces?

 
Mihail Matkovskij:

Adelante. Pero primero hay que entenderbien el código, porque el código es una cosa complicada, ¡y necesito un argumento claro!

No voy a entender su código "correctamente". Porque ya lo he investigado. Breve veredicto - ay de la mente.
Mejor que entiendas mi código, que escribiré en los próximos meses.