Toile et étiquettes

 

Je voudrais vous présenter une comparaison de la vitesse d'affichage du texte dans le graphique, créé à l'aide de différentes méthodes. La première variante de l'affichage que j'ai faite en utilisant la classe CCanvas, la seconde que j'ai créée sur des étiquettes (CChartObjectLabel). Toutes les classes ont été prises dans la bibliothèque standard. Cette idée m'est venue lorsque j'ai créé un affichage sur CCanvas et que cela ralentissait considérablement mon Expert Advisor. Dans le même temps, certains programmeurs ont affirmé que j'avais tort et queCCanvas, et pour être plus précis, OBJ_BITMAP_LABEL est très rapide, plus rapide que toutes les méthodes d'affichage des informations dans le graphique disponibles dans MetaTrader.J'ai donc décidé de le vérifier expérimentalement. Donc, le moment de vérité.

Fonctionnement de l'affichage avec sortie dansCCanvas

CCanvas

Charge du CPU en ce moment

CPU

Fonctionnement de l'affichage avec sortieCChartObjectLabel

Étiquettes

Fonctionnement deCChartObjectLabel avec le mode d'optimisation de la vitesse activé (je vous en parlerai plus loin).

Étiquettes optimisées

Maintenant, les valeurs temporelles. Total est la durée totale de fonctionnement du conseiller expert testé. Min delay,Mid delay etMax delay sont despériodes de retard sur les ticks. Mais ils ne peuvent pas toujours être obtenus correctement, malgré le fait que j'ai vérifié le code, il n'y avait pas d'erreurs. Je pense que cela a à voir avec la fonction GetTickCount64 dans le testeur. Mais c'est un problème insignifiant. L'essentiel est qu'il indique le temps total.

Laissez-moi maintenant vous parler brièvement de l'optimisation de l'affichage sur les étiquettes. En effet, pour que le texte apparaisse à l'écran, vous devez afficher les lignes d'un tableau spécial de lignes dans des étiquettes, qui sont disposées de haut en bas au nombre de 50 pièces. Mais lorsque seule la dernière ligne est mise à jour, il n'est pas nécessaire de mettre à jour toutes les étiquettes, il suffit de mettre à jour une seule étiquette qui correspond à cette ligne. En activant le mode "Optimisation de la mise à jour", nous obtenons un gain de performance de plus de 2 fois supérieur.

J'ai décidé de tester plus en détail l'affichage sur les étiquettes, car cette période de test est trop petite pour lui, en raison de sa vitesse. Par conséquent, j'ai augmenté la période de test. Et j'ai obtenu les résultats suivants.

SansoptimizeUpdate : false

optimizeUpdate : false

AvecoptimizeUpdate : true

optimizeUpdate : true

J'ai ajouté tous les résultats à Excel

comparaison des résultats

Le premier histogramme montre la comparaison globale, le second ne montre que la variante avec les étiquettes.

Conclusion : l'affichage créé sur CChartObjectLabel peut être 83,7 fois plus rapide que l'affichage équivalent sur CCanvas. Ce n'est pas pour rien que les opérations sur les pixels sont considérées comme les plus coûteuses de tous les programmes !

Je joins un tableau avec les résultats des tests. Le code source peut être téléchargé à partir du site KB: https://www.mql5.com/ru/code/33898.


Dossiers :
 

Je ne comprends pas pourquoi la comparaison était dans le Visualiseur et non dans le Terminal ?

Je n'ai pas regardé dans le code. C'est pour ce genre de tâches que Kanvas est fait un pour tous "50 lignes".


Dans le terminal, j'ai mesuré par le biais de la bible d'utilisation. Les méthodes ne montrent aucune différence significative.

 
fxsaber:

Je ne comprends pas pourquoi la comparaison s'est faite dans le Visualiseur et non dans le Terminal ?

Car dans le Visualiseur, c'est la lenteur du Canvas qui pose problème. Et vous pouvez voir ce qu'ils sont. Un tel affichage consomme plus de 50% du temps CPU, je l'ai mentionné plus haut ! Et dans Terminal, il faudrait appeler des méthodes en boucle pour tout voir. Mais je ne me suis pas embêté avec ça. J'ai un conseiller expert qui fonctionne en boucle avec une optimisation hors ligne, où, en fait, j'ai besoin d'un tel affichage avec des mises à jour rapides. Mais je ne suis pas prêt à le présenter pour le moment car le projet n'est pas encore terminé.


fxsaber:

Je n'ai pas regardé dans le code. C'est pour ce genre de tâches que Kanvas est fait un pour tous "50 lignes".

Alors, jetez un coup d'œil. C'est le seul là-bas !

 
Vous trompez les gens.
Tu veux vraiment me mettre le nez dedans, n'est-ce pas ?
Je savais que tu voudrais faire quelque chose comme ça. Et je savais que tu inventerais quelque chose comme ça.

Vous ne savez pas comment préparer des tests de comparaison.

 
Mihail Matkovskij:

Car dans le Visualiseur, c'est la lenteur de Canvas qui pose problème. Et vous pouvez voir lesquels. Un tel affichage consomme plus de 50% du temps CPU, je l'ai mentionné plus haut ! Et dans Terminal, il faudrait appeler des méthodes en boucle pour tout voir. Mais je ne me suis pas embêté avec ça. J'ai un conseiller expert qui fonctionne en boucle avec une optimisation hors ligne, où, en fait, j'ai besoin d'un tel affichage avec des mises à jour rapides. Mais je ne suis pas prêt à le présenter pour le moment, car le projet n'est pas encore terminé.


Alors, jetez-y un coup d'œil. C'est la seule là-bas !

Eh bien... si vous n'écrivez que pour un visualiseur, alors jouez ces jeux seuls. N'avez-vous jamais entendu dire que des graphiques, même des marques d'ouverture/fermeture de position, ralentissent le moteur de rendu ? Non.

Je vais essayer de ne pas vous déranger... créez des étiquettes séparées pour chaque lettre... et aussi une ressource séparée...

 
Nikolai Semko:
Vous trompez les gens.
Tu veux me mettre le nez dedans, n'est-ce pas ?
Je savais que tu voudrais faire quelque chose comme ça. Je savais que tu voudrais faire quelque chose comme ça.

Vous ne savez pas comment préparer des tests de comparaison.

Tout ce que j'ai compris de votre message, ce sont les mots "délire", "LOL", "je ne sais pas comment préparer les tests". Vraiment, je ne comprends pas comment ils se rapportent à ce sujet... Le reste, je ne comprends rien au mot "du tout" ! Lorsque j'ai créé ce fil de discussion, je voulais voir descritiques constructives ici, pas un tas d'affirmations incompréhensibles ! Alors, prenez la peine d'expliquer vos propos. Sinon, n'écrivez pas de bêtises ici !

 
Alexey Viktorov:

Eh bien... si vous n'écrivez que pour le visualiseur, alors jouez ces jeux seuls. N'avez-vous jamais entendu dire que tout graphique, même les marques d'ouverture/fermeture de position ralentissent le visualiseur ? Non.

Je vais essayer de ne pas vous déranger... créez des étiquettes séparées pour chaque lettre... et aussi une ressource séparée...

Je m'empresse de vous informer, Alexei. Vous avez, bien sûr, tendance à fantasmer, tout comme Nikolaï... Mais ce n'est pas vraiment la façon dont vous l'imaginez. Simplement, des solutions différentes sont nécessaires pour des tâches différentes. Est-ce que vous et Nikolaï avez des commentaires de fond? !

 
Mihail Matkovskij:

Tout ce que j'ai compris de votre message, ce sont les mots "délire", "LOL", "je ne sais pas comment préparer les tests". Vraiment, je ne comprends pas comment ils se rapportent à ce sujet... Le reste, je ne comprends rien au mot "du tout" ! Lorsque j'ai créé ce fil de discussion, je voulais voir descritiques constructives ici, pas un tas d'affirmations incompréhensibles ! Alors, prenez la peine d'expliquer vos propos. Sinon, n'écrivez pas de bêtises ici !

Patience, mon ami, patience.
Je n'ai pas autant de temps que vous. Je suis dans mon dernier semestre et j'ai trois projets de groupe en parallèle. Donc je suis ici en mode impulsif.
Mais, d'accord, je peux vous convaincre que vous vous trompez, mais détendez-vous et ne faites pas trop d'efforts, sinon mes efforts seront vains.
A moins, bien sûr, que votre esprit puisse maîtriser vos émotions.
 
Nikolai Semko:
Patience mon ami, patience.
Je n'ai pas autant de temps que vous. Je suis dans mon dernier semestre et j'ai trois projets de groupe en parallèle. Je suis donc ici par impulsion.
Mais, d'accord, je peux vous convaincre de vos illusions, mais détendez-vous et ne travaillez pas trop dur, sinon mes efforts seront vains.

Allez-y. Comprenez d'abordcorrectement le code, car le code est une chose compliquée, et j'ai besoin d'affirmations clairement étayées!

 

Je ne comprends pas. La première image présente une toile sur laquelle se trouve du texte.

Les images suivantes ne comportent pas de texte similaire sur le graphique.

Je veux dire, qu'est-ce qui était comparé alors ?

 
Mihail Matkovskij:

Allez-y. Mais d'abord comprendre le codecorrectement, parce que le code est une chose compliquée, et j'ai besoin d'une revendication argumentative claire!

Je ne comprendrai pas votre code "correctement". Parce que je me suis déjà renseigné. Verdict court - malheur de l'esprit.
Vous comprenez mieux mon code, que j'écrirai dans les deux prochains mois.